// 2010.12.03 # Doj
//     Модуль для удобной работы со словарями

// {{{ встроенный функционал
samebuiltin vocabulary-new
samebuiltin voc.share
samebuiltin vLOCAL
samebuiltin vGLOBAL
samebuiltin vBUILTIN
samebuiltin target<
samebuiltin target>
samebuiltin context<
samebuiltin context>
// }}}

: vocabulary ( "name") vocabulary-new value ;
: voc.use ( v) dup target< context< ;
: GLOBAL vGLOBAL voc.use ; immediate
: LOCAL vLOCAL voc.use ; immediate

// Работа с пространствами имён
//    Пример
//       : test 5 . ;
// 
//       namespace MY        // создаём своё пространство имён
//         : test 666 . ;    // определяем в нём команду test
//         test              // печатаем 666
//       /namespace          // завершаем определение пространства имён
// 
//       : test 7 . ;
//       test                // печатает 7
//       MY test ^^^         // печатает 666
//       : test2 MY test ^ ; // создали глобальный синоним для test
// 
//       namespace HER       // создаём ещё одно пространство имён
//         : func 555 . ;
//       /namespace
// 
//       func                // упс! такой команды нет
//       uses MY HER         // подключаем сразу два пространства имён
//         func test func test
//         // Важно, что тут нельзя снимать словари добавленные до uses словари
//         // и пространства, можно снимать только добавленные в этом же блоке
//         // Кроме того, все положенные внутри нулевые словари должны быть сняты,
//         // иначе /uses сработает неправильно
//       \uses               // отключаем подключённые в uses пространства
: declare-namespace ( "name") vocabulary immediate does> @ context< ; 
: extend-namespace context> voc.use ;
: namespace ( "name") declare-namespace last execute extend-namespace ; 
: \namespace target> drop context> drop ;
: ^^^ context> drop ;
: ^ ^^^ ; immediate
: uses 0 context< 0 target< ;
: \uses begin context> 0= until   begin target> 0= until ;
