CREATE ( --> )
Слово CREATE выбирает следующий токен из текста скрипта, создает новую словарную статью с этим именем. В список атомов добавляет слово SELF.
SELF ( --> Номер_выполняемого_слова 0)
Слово SELF помещает номер выполняемого в данный момент слова и константу 0 в стек. То есть выполняемое слово с помощью этого слова ложит на стек ссылку на само себя.
DOES>
Берет слова, определенные после себя до окончания определения и помещает их в список атомов последнего определенного слова. См. определение CONSTANT.
Окроем модуль "system.sf" и найдем определение:
: VARIABLE ( --> ) ( DOES> --> word_num index )
CREATE 0 ,
;
Что происходит при выполнении скрипта, содержащего данный текст (когда мы включаем данный модуль в свой скрипт)?
Создается словарная статья с именем VARIABLE. В список атомов добавляется последовательность слов:
CREATE
0
,
В своем скрипте мы определяем переменную v. Напоминаем, переменные не типизируются.
VARIABLE v
Встретив токен VARIABLE, интерпретатор находит в словаре слово с именем VARIABLE и выполняет его.
CREATE из списка атомов слова VARIABLE выбирает из текста скрипта следующий токен v (указатель интерпретатора стоит после токена VARIABLE), создает новую словарную статью с этим именем и в его список атомов добавляет слово SELF. 0 (константа 0) помещает свое значение в стек. , (запятая) переносит это значение из стека в список переменных последнего определенного на данных момент слова v.
После этого мы имеем слово v, которое при выполнении засылает свой адрес в стек и имеет один элемент в своем списке переменных со значением 0. Теперь можно выполнять 14 v ! (Засылаем значение в v) и v @ (пересылка значения переменной v в стек). Рекомендую прочитайте описание слов ! и @ еще раз с учетом вышесказанного.
В модуеле "system.sf" найдем определение слова CONSTANT:
: CONSTANT ( value --> ) ( DOES> --> value )
CREATE ,
DOES> @
;
При выполнении данного скрипта создается словарная статья с именем CONSTANT с соответствующими словами.
Определяем константу:
3,1415 CONSTANT PI
При выполнении этого скрипта происходит следуюее:
Засылается число в стек. Вообще говоря, мы можем производить любые вычисления, главное, чтобы при выполнении CONSTANT на вершине было значение, которо мы собираемся задать константе.
Встретив токен CONSTANT, интерпретатор находит в словаре слово с именем CONSTANT и выполняет его. CREATE из текста скрипта выбирает следующий токен PI, создает новую словарную статью с этим именем и в его список атомов добавляет слово SELF. Слово "," берет значение из стека (мы его туда положили перед вызовом CONSTANT) и добавляет его в список переменных последнего определенного слова (слово PI).
Слово DOES>берет все слова после себя до окончания определения слова CONSTANT, в данном случае только слово @ (разыменование) и помещает его в список атомов слова PI. В результате имеется слово PI, у которого один элемент в списке переменных, равный 3,1415 и следующий список атомов:
SELF
@
В данном случае слово CONSTANT - родитель. PI - ребенок. Слово DOES> позволяет при определении родителя задать последовательность команд, которые будет выполнять слово-ребенок при своем выполнии.
Мы при определении слова PI не определяли последовательность действий, которую оно должно выполнять. Если однотипных слов в тексте программы много, то это будет нерационально и некрасиво. Вместо этого мы определили порождающее слово CREATE, в котором определили, как будет выполняться порождаемые им слова.
В документации к слову выражение ( value --> ) ( DOES> --> value ) означает что само слово CONSTANT перед выполнением должно иметь на стеке value, после чего снимает его. ( DOES> --> value ) говорит, что порождаемое им слово при выполнении оставляет на вершине стека значение value.
Разберитесь самостоятельно, как работает слово ARRAY, определенное в модуле "sysltem.sf".