В последних сборках JBForth поддерживает (хотя ещё и небезбаговую) работу со словарями.
По словарям вкратце.
Словарь (изначально vocabulary, в последних стандартах - wordlist, "список слов") - это навроде каталога в файловой системе.
В разных словарях может быть слово с одним и тем же именем.
Поиск слова выполняется сперва в словаре, на который указывает переменная
CONTEXT (для запоминания - "контекстный поиск"). Если не находит - то проходит по специальному списку, получить который можно по
GET-ORDER, а просмотреть все переменные можно по
voc.
Новый словарь создаётся устаревшим, но наиболее удобным способом по слову
VOCABULARY.
code forth
vocabulary events
создать словарь "events"
Если после этого вызвать слово
events, то в переменную CONTEXT окажется записан наш новый словарь, и поиск слов будет вестись оттуда.
В случае неудачи, Форт будет пытаться искать по списку GET-ORDER, где обычно по умолчанию указан основной словарь Форта.
Поиск слов и определение новых слов в Форте независимы. Т.е. можно искать в одних словарях, а определения записывать в другие.
Словарь, в который идёт компиляция, определяется переменной
CURRENT.
Проще всего в эту переменную записать текущий словарь поиска (CONTEXT) по слову
DEFINITIONS.
code forth
events делаем контекстным словарь events
definitions пишем новые слова туда
Для работы со списком контекстного поиска (который просматривается по VOC.) служат слова:
ALSO - добавляет словарь из CONTEXT в список просмотра.
PREVIOUS - убирает последний словарь из списка, а предпоследний прописывает также в CONTEXT.
FORTH - основной словарь Форта.
Итак, примеры с голым консольным jbforth.jar (вывод описываю в виде комментария):
java -jar jbforth.jar
Создание слов в словарях, переключение словарей:
code forth
voc.
Current=WordList:forth-wordlist, Context=WordList:forth-wordlist, order = [WordList:forth-wordlist]
: test "Main dictionary" . ;
test
Main dictionary
vocabulary events
events
voc.
Current=WordList:forth-wordlist, Context=WordList:events, order = [WordList:forth-wordlist]
definitions
voc.
Current=WordList:events, Context=WordList:events, order = [WordList:forth-wordlist]
: test "Events dictionary" . ;
test
Events dictionary
forth
test
Main dictionary
voc.
Current=WordList:events, Context=WordList:forth-wordlist, order = [WordList:forth-wordlist]
events test
Events dictionary
voc.
Current=WordList:events, Context=WordList:events, order = [WordList:forth-wordlist]
вложенные словари:
code forth
vocabulary events
events definitions
vocabulary balancer
balancer definitions
: test "Events/Balancer dictionsry" . ;
test
Events/Balancer dictionsry
voc.
Current=WordList:balancer, Context=WordList:balancer, order = [WordList:forth-wordlist]
forth
test
Abort: Unknown word 'test' in >| test |<
balancer
Abort: Unknown word 'balancer' in >| balancer |<
events balancer
voc.
Current=WordList:balancer, Context=WordList:balancer, order = [WordList:forth-wordlist]
also
voc.
Current=WordList:balancer, Context=WordList:balancer, order = [WordList:balancer, WordList:forth-wordlist]
forth
voc.
Current=WordList:balancer, Context=WordList:forth-wordlist, order = [WordList:balancer, WordList:forth-wordlist]
test
Events/Balancer dictionsry
previous
voc.
Current=WordList:balancer, Context=WordList:forth-wordlist, order = [WordList:forth-wordlist]
test
Abort: Unknown word 'test' in >| test |<
Что непонятно в примерах - спрашивайте
Посмотреть список слов в текущем словаре можно по слову
WORDS. Но оно сейчас глючит в основном словаре. Для отладки же - вполне можно использовать.
Проблема с которой можно столкнуться в l2j при использовании словарей:
1. Слова admin_*, user_*, bypass_* и т.п. всегда ищутся в словаре по умолчанию. Он же для пользователя почти всегда - FORTH. Поэтому не забывайте, работая в своих словарях, при определении этих слов, переключаться в основной словарь:
code forth
...
events definitions
: XXX ( это слово в словаре EVENTS ) ... ;
...
also forth definitions
: bypass_XXX ( а это - уже в базовом словаре ) ... ;
previous definitions
: YYY ( снова словарь events ... ) ;
...