Уроки JBForth. Часть 1.

 
+
-
edit
 

Balancer

администратор
★★★★★
Так, если где-то и были такие темы, то то ли Abaddon в своё время с форумом JBForth грохнул, то ли заголовки у них невнятные и поиском не находятся.

Поэтому начинаю заново. Заголовок соответствующий. Если что - поиск нам поможет.

Базовые понятия

Сперва читаем старую ссылочку Принципы Форта

При чём, если в браузере установлена Java, там же можно побаловаться с простейшим Java-апплетом, реализацией Форт-движка.

Дальше на сайте развивать в нынешнем виде не буду, так как на форуме удобнее. А потом, когда на форуме будет механизм статей, соединю весь цикл в один набор.

Словари

Форт, едва ли не первый язык, где появилось понятие области видимости объектов языка. Но это не прямой аналог namespaces современных ЯВУ.

Все объекты Форта (дальше буду в Форт-терминах называть их "слова") хранятся в "словарях". Ближайший аналог - каталоги файловой системы. Есть основной словарь, FORTH, всегда включенный по умолчанию. В нём хранятся основные слова, вызываемые при обычной работе. Больше стандартных словарей нет.

Но можно создавать произвольное количество словарей своих с любыми вложениями. Скажем, есть у нас слово TYPE, которое занимается выводом строки (аналог print). А мы хотим завести, например, переменную с таким именем. Конечно, можно завести её и в основном словаре, но тогда старое слово станет недоступно, новое его перекроет. Сделаем просто новый словарь и определим новое слово туда.

Когда Форт ищет какое-то слово, он всегда перебирает указанные ему особо словари в заданном программистом порядке. Порядок этот можно произвольно менять. Что-то навроде переменной PATH при запуске програм, кто знает, что это такое.

Подробнее о словарях можно почитать по ссылке Словари в Форте. [Diamond#11.08.06 14:06]

(продолжение следует)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  
+
-
edit
 

Balancer

администратор
★★★★★
Итак, сразу же продолжу. В конференции сегодня предложил разобрать свежий код, чтобы расспросили всё, что непонятно. Но ответ был только один - "рассказать построчно". Т.е. непонятно, вроде бы, всё? :D Тогда лучше тему продолжить на форуме. Итак, код:
code forth
  1. forth:: escape_to_castle  ( -- )
  2.     self p.castle
  3.     ?dup unless
  4.         ru: У Вас нет замка
  5.         en: You have not castle
  6.         type
  7.         exit
  8.     then
  9.  
  10.     self p.castle-owner-restart-point
  11.     jump
  12. ;


Как и положено в Форте, разберём его слово за словом. Ибо единственным разделителем у нас является пробел (табуляция, перевод строки и т.п.)

forth::. Нестандартное слово. Вариант слова :, которое определяет новое слово, но компилирует его не в текущий словарь, а всегда в FORTH. Скилловы при выполнении типа CODE ищут указанное слово только в базовом словаре. А вдруг мы потом этот код внутрь модуля спрячем?

escape_to_castle. Просто имя нового слова.

( -- ). Комментарий. Описывает входные аргменты слова (до "--") и выходные данные. В данном случае и тех, и других нет. Слово ничего не принимает со стека и ничего не возвращает. Вообще, строго формально, слово тут одно - "(". Это слово берёт со входного потока всё до символа ")" и игнорирует.

self. Возвращает объект игрока (в общем случае - любого владельца Форта). После выполнения на стеке окажется ссылка на соответствующий L2Player. Нотация записи такая: ( — player )

p.castle. Снимает со стека ссылку на игрока (подсказка в имени - "p.") и возвращает в стек ссылку на замок игрока или null, если клана и/или замка нет. Нотация стека: ( player — castle )

?dup. Стандартное слово, которое дублирует на стеке число (как делает просто "dup") только если оно не равно false/0/null/"". Иначе - ничего не делает. Т.е. нотация будет или ( castle — castle castle ) или ( null — null )

unless. Нестандартное слово, имя которого взято из Perl'а. Там unless(...) - это аналог if(!...), т.е. для Форта это примерный аналог "not if". Идущий следом код будет выполняться только если на входе были false/null/""/0. До слова "then", которое является аналогом "endif" в других языках :) (напомню: "condition if doing then"). Всегда снимает со стека один параметр, т.е. ( some — ) а дальше, если была ложь, то выполняет код до then, иначе - сразу переходит к выполнению того, что за then.

Дальше у нас код, выполняющийся, если на стеке был null, т.е. замка не было.

ru: У Вас нет замка. Берёт текст до конца строки кода. Если стоит русский язык игрока, то поместит этот текст на стек как строку. ( — "текст" ) или ( — )
en: You have not castle. Аналогично для английского языка или, если язык был не определён (поэтому en: всегда должна идти после ru:). ( — "text" ) или ( — )

После этих двух слов на стеке обязательно будет хоть одна строка. Т.е. по ним в комплекте: ( — "text/текст" )

type. Отсылает игроку "sendMessage" с текстом, который снимет со стека. ( "сообщение" — ).

exit. Аналог return. Выход из слова.

then. Конец условного блока. Поскольку вышли мы из него, каламбур, безусловно, то дальше мы выполняемся только в том случае, если замок у игрока есть.

К этому месту на стеке у нас (благодаря связки (castle) ?dup unless ) лежит ссылка на замок. Т.е. ( castle )

self. Было выше. Итого: ( castle player — )

p.castle-owner-restart-point. Слово, снимающее со стека ссылку на игрока ("p.") и берущее ещё одним параметром ссылку на замок. В ответ - возвращает на стеке три числа - x, y и z. Координаты одной из случайных точек респавна владельцев замка. ( castle player — x y z )

jump. Телепортация по переданным слову координатам. ( x y z — )

;. Конец определения слова. Возврат к режиму интерпретации.

Всё. Задавайте вопросы :)
… чтобы понять рекурсию, нужно сперва понять рекурсию …  
+
-
edit
 

Balancer

администратор
★★★★★
Ещё одна ссылка в копилку - Простой квест: сходи, убей, принеси.
… чтобы понять рекурсию, нужно сперва понять рекурсию …  

в начало страницы | новое
 
1945: Ядерная бомбардировка Хиросимы (79 лет).
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru