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

 
+
-
edit
 

Balancer

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

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

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

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

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

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

vocabulary events

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

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

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

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

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

Проще всего в эту переменную записать текущий словарь поиска (CONTEXT) по слову DEFINITIONS.

events  делаем контекстным словарь events
definitions  пишем новые слова туда


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

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

Создание слов в словарях, переключение словарей:

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]


вложенные словари:

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. Поэтому не забывайте, работая в своих словарях, при определении этих слов, переключаться в основной словарь:

 ...
events definitions
: XXX ( это слово в словаре EVENTS ) ... ;
 ...
also forth definitions
: bypass_XXX ( а это - уже в базовом словаре ) ... ;
previous definitions
: YYY ( снова словарь events ... ) ;
 ...
… чтобы понять рекурсию, нужно сперва понять рекурсию …  
+
-
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
 

Balancer

администратор
★★★★★
Спрашивайте ещё :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  
+
-
edit
 

Diamond

втянувшийся

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

Diamond

втянувшийся

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

Balancer

администратор
★★★★★
Смотрим также тему Упрощённая работа со словарями: MODULE: .. EXPORT .. ;MODULE
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

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