Словари в Форте.

 
+
-
edit
 

Balancer

администратор
★★★★★
В последних сборках JBForth поддерживает (хотя ещё и небезбаговую) работу со словарями.

По словарям вкратце.

Словарь (изначально vocabulary, в последних стандартах - wordlist, "список слов") - это навроде каталога в файловой системе.

В разных словарях может быть слово с одним и тем же именем.

Поиск слова выполняется сперва в словаре, на который указывает переменная CONTEXT (для запоминания - "контекстный поиск"). Если не находит - то проходит по специальному списку, получить который можно по GET-ORDER, а просмотреть все переменные можно по voc.

Новый словарь создаётся устаревшим, но наиболее удобным способом по слову VOCABULARY.
code forth
  1. vocabulary events

создать словарь "events"

Если после этого вызвать слово events, то в переменную CONTEXT окажется записан наш новый словарь, и поиск слов будет вестись оттуда.

В случае неудачи, Форт будет пытаться искать по списку GET-ORDER, где обычно по умолчанию указан основной словарь Форта.

Поиск слов и определение новых слов в Форте независимы. Т.е. можно искать в одних словарях, а определения записывать в другие.

Словарь, в который идёт компиляция, определяется переменной CURRENT.

Проще всего в эту переменную записать текущий словарь поиска (CONTEXT) по слову DEFINITIONS.
code forth
  1. events  делаем контекстным словарь events
  2. definitions  пишем новые слова туда


Для работы со списком контекстного поиска (который просматривается по VOC.) служат слова:
ALSO - добавляет словарь из CONTEXT в список просмотра.
PREVIOUS - убирает последний словарь из списка, а предпоследний прописывает также в CONTEXT.
FORTH - основной словарь Форта.

Итак, примеры с голым консольным jbforth.jar (вывод описываю в виде комментария):
java -jar jbforth.jar

Создание слов в словарях, переключение словарей:
code forth
  1. voc.
  2.  Current=WordList:forth-wordlist, Context=WordList:forth-wordlist, order = [WordList:forth-wordlist]
  3. : test "Main dictionary" . ;
  4. test
  5.  Main dictionary
  6. vocabulary events
  7. events
  8. voc.
  9.  Current=WordList:forth-wordlist, Context=WordList:events, order = [WordList:forth-wordlist]
  10. definitions
  11. voc.
  12.  Current=WordList:events, Context=WordList:events, order = [WordList:forth-wordlist]
  13. : test "Events dictionary" . ;
  14. test
  15.  Events dictionary
  16. forth
  17. test
  18.  Main dictionary
  19. voc.
  20.  Current=WordList:events, Context=WordList:forth-wordlist, order = [WordList:forth-wordlist]
  21. events test
  22.  Events dictionary
  23. voc.
  24.  Current=WordList:events, Context=WordList:events, order = [WordList:forth-wordlist]


вложенные словари:
code forth
  1. vocabulary events
  2. events definitions
  3. vocabulary balancer
  4. balancer definitions
  5. : test "Events/Balancer dictionsry" . ;
  6. test
  7.  Events/Balancer dictionsry
  8. voc.
  9.  Current=WordList:balancer, Context=WordList:balancer, order = [WordList:forth-wordlist]
  10. forth
  11. test
  12.  Abort: Unknown word 'test' in >| test |<
  13. balancer
  14.  Abort: Unknown word 'balancer' in >| balancer |<
  15. events balancer
  16. voc.
  17.  Current=WordList:balancer, Context=WordList:balancer, order = [WordList:forth-wordlist]
  18. also
  19. voc.
  20.  Current=WordList:balancer, Context=WordList:balancer, order = [WordList:balancer, WordList:forth-wordlist]
  21. forth
  22. voc.
  23.  Current=WordList:balancer, Context=WordList:forth-wordlist, order = [WordList:balancer, WordList:forth-wordlist]
  24. test
  25.  Events/Balancer dictionsry
  26. previous
  27. voc.
  28.  Current=WordList:balancer, Context=WordList:forth-wordlist, order = [WordList:forth-wordlist]
  29. test
  30.  Abort: Unknown word 'test' in >| test |<


Что непонятно в примерах - спрашивайте :)

Посмотреть список слов в текущем словаре можно по слову WORDS. Но оно сейчас глючит в основном словаре. Для отладки же - вполне можно использовать.

Проблема с которой можно столкнуться в l2j при использовании словарей:

1. Слова admin_*, user_*, bypass_* и т.п. всегда ищутся в словаре по умолчанию. Он же для пользователя почти всегда - FORTH. Поэтому не забывайте, работая в своих словарях, при определении этих слов, переключаться в основной словарь:
code forth
  1.  ...
  2. events definitions
  3. : XXX ( это слово в словаре EVENTS ) ... ;
  4.  ...
  5. also forth definitions
  6. : bypass_XXX ( а это - уже в базовом словаре ) ... ;
  7. previous definitions
  8. : YYY ( снова словарь events ... ) ;
  9.  ...
 
+
-
edit
 

masterXL

разработчик OpenWorlds
ну.... мудрено... вроде только начал понимать что к чему и откуда ноги растут...
ай Бал, ай малаца! Я столько не выпью...
ладно. пойду смотреть
Трудно быть богом... Не веришь? Спроси любого админа! можешь спросить у меня 175506816 ServerIP=193.41.172.19 Перенос доступен  
+
-
edit
 

masterXL

разработчик OpenWorlds
курил новый код целый день не понял ни байта! в админке нет ни одного евента, даже правленных тобой медалей
Трудно быть богом... Не веришь? Спроси любого админа! можешь спросить у меня 175506816 ServerIP=193.41.172.19 Перенос доступен  

kuta

разработчик l2j-сервера
Пара вопросов
1)Возможно поиск форт слова из java по определённому словарю ?
2)Насколько быстро происходит поиск слова ?
 
+
-
edit
 

masterXL

разработчик OpenWorlds
bypass_xxxxx лежит в фортовом словаре.
в коде пытаюсь вызвать-
forth also definitions
: bypass_medals
...
;
previous definitions
получаю - нет хендлера для такого бипаса... спасай
Трудно быть богом... Не веришь? Спроси любого админа! можешь спросить у меня 175506816 ServerIP=193.41.172.19 Перенос доступен  
+
-
edit
 

Balancer

администратор
★★★★★
kuta> 1)Возможно поиск форт слова из java по определённому словарю ?

Да, возможен. Методы, типа find_word и т.п.

kuta> 2)Насколько быстро происходит поиск слова ?

Выборка из HashMap<String,Word>. Лучше всего, заводить в Java переменную типа Word и писать туда из Форта адрес (ссылку) слова. Или через Java найти и запомнить один раз. Тогда потери будут совсем минимальны (фактически, код Форт-слова, это серия вызовов методов .exec() для ссылок, записанных в виде массива).
 
+
-
edit
 

Balancer

администратор
★★★★★
masterXL> получаю - нет хендлера для такого бипаса... спасай

Вручную находится? Т.е. по //bypass_medals ?

В принципе, раньше находилось. Детально тестировать сейчас не смогу, рабочая неделя начинается :-/
 
+
-
edit
 

masterXL

разработчик OpenWorlds
masterXL>> получаю - нет хендлера для такого бипаса... спасай
Balancer> Вручную находится? Т.е. по //bypass_medals ?
Balancer> В принципе, раньше находилось. Детально тестировать сейчас не смогу, рабочая неделя начинается :-/
На конфе не успел рассказать. пребрал все возможные варианты.. не отрабатываются байпассы ВООБЩЕ
Трудно быть богом... Не веришь? Спроси любого админа! можешь спросить у меня 175506816 ServerIP=193.41.172.19 Перенос доступен  
+
-
edit
 

Balancer

администратор
★★★★★
Хм... Может, чего-то сломали :-/ Буду смотреть ещё.
 
+
-
edit
 

chukcha

разработчик l2j-сервера
Что-то не могу понять, как запускать слова из словарей. Например, хочу запустить вручную (из окна чата) ивент на медали. Может чо недочитал-нанашел-недопонял? Получается только через //events и далее выбираем. Юзаем последнюю по всеобщей "отлучки" сборку. Может кто подскажет...
Хотел закинуть в раздел Форта, там есть про ивент не медальки, но здесь показалось уместнее...
Russian Mafia TEAM (RMT) Lineage 2 C3 Server (L2J Fortress) http://www.la2c3.ru НИЧТО НЕ СЛИШКОМ.  
+
-
edit
 

chukcha

разработчик l2j-сервера
Вопрос снят - разобрался сам. Сипасибо!
Russian Mafia TEAM (RMT) Lineage 2 C3 Server (L2J Fortress) http://www.la2c3.ru НИЧТО НЕ СЛИШКОМ.  
+
-
edit
 

chukcha

разработчик l2j-сервера
Правильно я понимаю что
forth:: bypass_medals-1 ;
заменяет
also forth definitions
: bypass_medals-1 ;
previous definitions
?
Т.е. упрощена схема вызова.

Russian Mafia TEAM (RMT) Lineage 2 C3 Server (L2J Fortress) http://www.la2c3.ru НИЧТО НЕ СЛИШКОМ.  
+
-
edit
 

Balancer

администратор
★★★★★
Правильно я понимаю что
forth:: bypass_medals-1 ;
заменяет
also forth definitions
: bypass_medals-1 ;
previous definitions
?
Т.е. упрощена схема вызова.
 


Да. При чём заменяет корректно :)
 
+
-
edit
 

masterXL

разработчик OpenWorlds
спасибо бАльшое!!!!!! 8)
Трудно быть богом... Не веришь? Спроси любого админа! можешь спросить у меня 175506816 ServerIP=193.41.172.19 Перенос доступен  
+
-
edit
 
+
-
edit
 

Diamond

втянувшийся

Вроде все верно сделал, но не работает.
forth:: bypass_pvp_check вызывается корректно, а вот "pvp_announce" 60000 timer-start пишет что слово pvp_announce не существует. Если убрать словари - работает.
Прикреплённые файлы:
pvp.rar (скачать) [2,09 кбайт, 161 загрузка] [attach=33214]
 
 
 
+
-
edit
 

Diamond

втянувшийся

Изменил also arena definitions на also forth definitions - заработало. Но мне почему-то кажется что так не должно быть...
 
AD Реклама Google — средство выживания форумов :)
+
-
edit
 

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru