Язык Форт и его реализации

         

Динамическая идентификация - часть 3


FORTH DEFINITIONS VOCABULARY П VOCABULARY К П DEFINITIONS ( ДЕЙСТВИЯ С ПЕРЕМЕННЫМИ) : ЗНАЧ ( PFA->N:ЗНАЧ) @ FORTH ; : АДР ( PFA->A:АДР) FORTH ; К DEFINITIONS ( ДЕЙСТВИЯ С КОНСТАНТАМИ) : ЗНАЧ ( PFA->N:ЗНАЧ) @ FORTH ; : АДР ( PFA->) CR ." НЕДОПУСТИМОЕ ИСПОЛЬЗОВАНИЕ КОНСТАНТЫ " BODY> >NAME ID. ABORT ; FORTH DEFINITIONS : ЗНАЧ ( ->) ; : АДР ( ->) -1 ABORT" НЕДОПУСТИМЫЙ АДРЕС" ;

Заметим, что при исполнении слов ЗНАЧ и АДР в контекстах П и К помимо вычисления соответствующего значения текущий контекст переключается на FORTH. Исполняющая часть определяющих слов ПЕРЕМ и КОНСТ теперь состоит в установке соответствующего контекста, при этом на стек кладется адрес поля параметров данной статьи:

: ПЕРЕМ ( ->) CREATE 0 , DOES> ( PFA->PFA) П ; : КОНСТ ( ->) CREATE BL WORD DROP ( ВЫБРАТЬ ЗНАК =) BL WORD NUMBER DROP ( N:ЗНАЧ) , DOES> ( PFA->PFA) К ;

Чтобы теперь при обработке выражения в левой части присваивания получать значение переменной или константы, надо слегка изменить определение слова >ОПРЦ> (см. ) — включить в него исполнение операции ЗНАЧ, которая идентифицируется динамически по текущему контексту.

: >ОПРЦ> ( N:ПРИОРИТЕТ->) >R " ЗНАЧ" FIND DROP EXECUTE BEGIN ОПРЦ@ R@ < NOT WHILE ОПРЦ> DROP ОПРЦ> ( CFA) EXECUTE REPEAT R> DROP ;

Если это определение исполняется сразу после переменной или константы (в контексте П или К), то оно преобразует адрес поля параметров соответствующей статьи, который находится в этот момент на вершине стека, в значение данной переменной или константы. Для всех других случаев (контекст FORTH) преобразования стека не происходит. Именно по этой причине определения ЗНАЧ в списках П и К по завершении их исполнения переключают текущий контекст на FORTH, а в списке FORTH присутствует определение ЗНАЧ с пустым действием. Последнее обстоятельство гарантирует успешный поиск слова ЗНАЧ в любом контексте, поэтому в приведенном определении проверка того, что поиск закончился успешно, опущена.


Содержание  Назад  Вперед