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



             

Приложение Б: Определение DOER/MAKE


ПРИЛОЖЕНИЕ Б

О П Р Е Д Е Л Е Н И Е D O E R / M A K E ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

----------------------------------------------------------------

Если в Вашей системе слова DOER и MAKE еще не определены, это приложение призвано помочь Вам их ввести и, при необходимости, понять принцип их работы. Поскольку по природе своей эти конструкции системно-зависимы, я привел несколько различных реализаций в конце приложения в надежде, что одна из них будет работать и у Вас. Если же этого не произойдет, и если в этом разделе Вам не хватит информации для того, чтобы заставить все работать, то, видимо, у Вас какая-то необычная система. Пожалуйста, не обращайтесь за помощью ко мне; спросите поставщиков Вашего Форта. Вот как это работает. DOER - это определяющее слово, которое создает словарную статью с одной ячейкой памяти в поле ее параметров. Эта ячейка содержит адрес вектора и инициализируется указанием на слово, которое ничего не делает (по имени NOTHING). Потомки слова DOER исполняют код после DOES> в нем, который делает всего две вещи: достает адрес вектора и заносит его на стек возвратов. Это все. Продолжение исполнения Форта производится с этого адреса со стека возвратов, что вызывает исполнение векторизованной функции. Это все равно, что сказать (в стандарте '83)

' NOTHING >BODY >R

что даст исполнение NOTHING. (Такой трюк годится только для определений через двоеточие.) Вот иллюстрация по словарной статье, созданной после ввода

DOER ДЖО

+-------------------+--------------------+ | Д Ж О | pfa слова NOTHING | +-------------------+--------------------+ заголовок поле параметров

Теперь предположим, мы определили

: ТЕСТ MAKE ДЖО CR ;

то есть мы создали слово, которое может направить ДЖО на выдачу перевода каретки. - 284 -

Вот рисунок, изображающий скомпилированное определение слова ТЕСТ:

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




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