Способ мышления-Форт



             

Приложение Б: Определение DOER/MAKE - часть 2


Давайте глянем на код для MAKE. Поскольку мы используем его внутри определения через двоеточие, переменная STATE будет в состоянии "истина", и мы исполним фразу

COMPILE (MAKE) HERE MARKER ! 0 ,

Можно видеть, как MAKE скомпилировало адрес программы времени исполнения (MAKE), после которого записала ноль. (Мы объясним, для чего этот ноль и почему мы записали его адрес в переменную MARKER, попозже.) Теперь посмотрим, что (MAKE) делает, когда мы исполняем новое определение ТЕСТ:

R> Получает адрес со стека возвратов. Этот адрес указывает на ячейку сразу после (MAKE), где находится ноль. DUP 2+ Получает адрес следующей ячейки после (MAKE), где размещен адрес ДЖО. DUP 2+ Получает адрес третьей ячейки после (MAKE), где начинается код, который мы хотим исполнить. На стеке теперь ( 'маркера 'джо 'кода ) SWAP @ >BODY Берет содержимое адреса, указывающего на ДЖО (т.е. получает адрес самого ДЖО) и вычисляет pfa ДЖО, где хранится адрес вектора. ! Записывает адрес, по которому начинается новый код (CR и т.д.) по адресу вектора ДЖО. Теперь ДЖО указывает внутрь определения слова ТЕСТ. Если мы введем ДЖО, мы получим возврат каретки. @ ?DUP Берет содержимое ячейки, содержащей ноль. IF >R THEN Поскольку там ноль, тело IF THEN не исполняется.

Вот основная идея. Но как насчет ячейки с нулем? Она - для использования слова ;AND. Предположим, мы изменили ТЕСТ так:

: ТЕСТ MAKE ДЖО CR ;AND SPACE ; - 285 -

То есть когда мы вызываем ТЕСТ, оно направит вектор ДЖО на CR, а затем немедленно исполнит SPACE. Вот как будет выглядеть новая версия ТЕСТ:

+--------------------------- | \/ +---------+------+------+------+------+------+------+------+ | Т Е С Т | адр. | адр. | адр. | адр. | адр. | адр. | адр. | | |(MAKE)| | ДЖО | CR | EXIT | SPACE| EXIT | +---------+------+------+------+------+------+------+------+ заголовок маркер

Вот определение ;AND:

: ;AND COMPILE EXIT HERE MARKER @ ! ; IMMEDIATE

Видно, что ;AND скомпилировало EXIT так же, как это сделало бы слово ;. Далее, припомните что MAKE сохранило адрес нуля в переменной MARKER.


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