Хоть и расточительно тратить эти слова, могли бы на что-то ещё пригодиться, но уж больно наглядно с ними выходит
[[ - это полный синоним слов
:noname (стандартное слово) и
&: (нестандартное, смысл сочетания - "адрес (
&)определённого далее слова (
:)").
]] - синоним
;.
Первое слово создаёт безымянное определение, возвращая его адрес. Второе - завершает определение как обычно.
Чаще всего слово :noname и, соответственно, сабжи требуются, если нужно передать куда-то адрес слова. Это то, что в функциональном программировании называется лямбдой.
Пример.
Слово
do-players снимает со стека один параметр и выполняет его для всех игроков сервера. Если это строка - то будет интерпретировать строку. Что, однако, медленно. Ибо будет интерпретироваться во время выполнения и для каждого игрока индивидуально. Кроме того, в режиме интерпретации нельзя, например, пользоваться условиями или циклами. Пример (можно ввести из админки), который выдаёт каждому игроку сервера по 1 адене:
"1 57 items_add" do-players
Можно do-players передать не строку, а адрес (ссылку) на определённое ранее слово:
code forth
: add_one_adena 1 57 items_add ;
& add_one_adena do-players
(напомню, что
& - это алиас стандартного слова
['], которое возвращает адрес на идущее следом слово)
В таком виде оно будет работать намного быстрее, но "мусорит" лишним словом.
Классическое решение - использование
:noname ... ; - сделает то же самое, но без запоминания нашего временного слова в словаре:
:noname 1 57 items_add ; do-players
Но в таком виде оно всё ещё громоздко и плохо читается. А что у нас Форт? Правильно, краткость и наглядность. Переписываем то же самое с использованием синонимов:
[[ 1 57 items_add ]] do-players.
Всё. Красиво и быстро!