Gudleifr> А не рассматривался в таком случае вопрос упрощения FORTH-машины в силу наличия уже готовых более мощных механизмов?
Ну, у меня парсер был не совсем честный
В смысле не на Форте с BL WORD, а сразу на Java. Что позволило просто и более привычно те же строки вводить, просто описывая их в кавычках (
"Hello world" . ). Или инклудить внешние файлы, просто указав имя и/или относительный путь.
Gudleifr> Или, наоборот, превращения FORTH-машины в объект, который можно наследовать, суб- и супер-классировать?
В Java итак всё — объект. И вся Форт-машина была отдельным объектом. Которых в исходном сервере могло быть несколько. Вообще даже практиковался перезапуск всей Форт-системы просто через присваивание глобальному инстансу нового объекта (а старый потом вычищался сборщиком мусора, когда освобождались все связи).
Вообще, когда JBForth-1 делал, то сперва начинал делать классическую систему, с HERE, addr и т.п. Но быстро понял, что уход от классики делает систему гибче, проще, надёжнее. Скажем, шитый код (в JBF1 он использовался) — это индивидуальный массив в объекте каждого слова, что позволяет не иметь общий код, не ломать голову с FENCE/FORGET и т.п. То есть фактически монолитный байтовый массив оригинальной Форт-машины превращается в графовый набор объектов со взаимными связями, который произвольно модифицируется во время работы.
А выглядел код примерно так в итоге:
code forth
jail: also
events diamond arena also
forth:: on-player-escape
jailed? int if
\ -------- Jail ---------
"You are jailed yet." "Jail system" player@ .tell
jail-coords list-rev> drop
else
\ -------- Arena --------
pvp_escape_check
then
;
previous
previous
Кстати, из Форта, естественно (иначе бы многое потерялось) можно было вызывать произвольные методы настоящих Java-классов, предварительно описав их как Форт-слова:
code forth
2World.class "getTerritory" { int.class dup } japi-static-func: xy>territory
"javolution.util.FastList" class value FastList.class
L2Territory.class "getName" { } japi-func: territory>name
\ Получить n-й элемент списка:
FastList.class "get" { int.class } japi-func: FastList@
\ Получить размер списка:
FastList.class "size" { } japi-func: FastList#
Массив массивов как один объект в переменной:
code forth
{
{ 122068 -221032 -3674 }
{ 194628 -183403 0571 }
{ -115197 222523 -2948 }
{ 177643 -177243 -544 }
{ 63853 29202 -3841 }
{ 115956 245614 -127 }
{ 83487 147878 -3215 }
{ 79713 146644 -2995 }
{ -109449 220168 -466 }
{ 25885 -148830 -3728 }
{ -10759 -136501 -2576 }
{ 159887 -209841 -3638 }
} value random-points
Ассоциативные массивы (в этом примере индексы целочисленные):
code forth
new-hashmap
{ 65897 157895 -3600 1 } => 1
{ 52381 153395 -2404 2 } => 2
{ 82390 219090 -3482 3 } => 3
{ 83373 94298 -3457 4 } => 4
{ 109283 84002 -2463 5 } => 5
{ 80702 58954 -1968 6 } => 6
{ 147461 31418 -2442 7 } => 7
value way-points
Русский иногда использовался по приколу:
code forth
tools.f
module: territory:
0 value зона \ список точек зоны
0 value точка \ целое число от 0 до размера зоны - 1
0 value указатели \ список npc-указателей границ зоны
1147 constant тип_скилла
20001 constant тип_моба
2000 constant задержка
: следующая_точка ( -- )
точка 1+
зона list# mod \ "Заворачиваем" территорию по кольцу
to точка
;
: предыдущая_точка ( -- позиция )
точка
dup 0 <= if
зона list# +
then
1-
;
: показать_точку ( -- )
указатели точка list@ ?dup if false unspawn then
зона точка list@.
list-rev> drop z>geo \ получили x y z очередной точки
0 тип_моба 0 false
spawn
dup c.paralyze
dup указатели точка list!
указатели предыдущая_точка list@
?dup unless
drop exit
then
тип_скилла 1 500 500 new-MagicSkillUser
player@ p.broadcast
;
: начальная_точка ( -- ) 0 to точка ;
Вообще, сейчас глянул — хотя это был вспомогательный инструмент, тем не менее накатали 1.3Мб в 1580 файлах
Need help cloning? Visit Bitbucket 101.
Atlassian SourceTree is a free Git and Mercurial client for Windows.
Atlassian SourceTree is a free Git and Mercurial client for Mac.
Atlassian SourceTree is a free Git and Mercurial client for Windows.
Atlassian SourceTree is a free Git and Mercurial client for Mac.
// bitbucket.org