Начальный курс программирования на языке Форт

         

ПРОИЗВОЛЬНОЕ ИЗМЕНЕНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ ВЫПОЛНЕНИЯ СЛОВ


Существует возможность опустить один уровень исполнения, просто удалив один адрес из стека возвратов. В качестве примера рассмотрим три уровня исполнения, связанных со словом ОБЕД:

Предположим, что мы изменили определение ВТОРОЕ: : ВТОРОЕ ЦЫПЛЕНОК РИС R> DROP ;

Выражение "R> DROP" удалит из стека возвратов адрес возврата в слове ДЕСЕРТ, который был туда помещен перед выполнением слова ВТОРОЕ. Если перезагрузить эти определения и выполнить слово ОБЕД, то EXIT третьего уровня обеспечит возврат непосредственно на первый уровень. Мы «съедим» ПЕРВОЕ, ЦЫПЛЕНКА и РИС, но останемся без ДЕСЕРТА:

Применять в прикладной программе выражения "R> DROP" нежелательно, поскольку это противоречит принципам структурного программирования. Тем не менее данное выражение иногда позволяет упростить решение задачи. Мы не будем здесь приводить аргументы «за» и «против», однако изложенное должно послужить вам предостережением.

Как недавно упоминалось, слово EXIT удаляет адрес возврата из вершины стека возвратов и помещает его в указатель интерпретатора. Интерпретатор адреса, который ориентируется по содержимому указателя интерпретатора, начинает поиск на следующем верхнем уровне. Можно включить EXIT в середину определения. Например, если бы мы переопределили слово ВТОРОЕ: : ВТОРОЕ РИС ВЕГЕТАРИАНЕЦ IF EXIT THEN ЦЫПЛЕНОК ;

и при этом были бы вегетарианцами, то нам пришлось бы выполнить EXIT после слова РИС, пропустить слово ЦЫПЛЕНОК и перейти сразу к ДЕСЕРТУ.

Приведенное выше определение эквивалентно следующему: : ВТОРОЕ РИС ВЕГЕТАРИАНЕЦ NOT IF ЦЫПЛЕНОК THEN ;

Вы не имеете права использовать внутри оператора цикла DO слово EXIT, так как это слово удаляет из стека один из аргументов, занесенных в него оператором DO (вместо того, чтобы удалить из стека возвратов адрес возврата)!

Вы только что видели результат удаления адреса возврата из стека возвратов. Приведем еще один пример - занесение в стек возвратов лишнего адреса (вам, может быть, придется привести адреса cfa и pfa в соответствии с вашей системой): : ПРИВЕТ ." Привет " ; : ДО-СВИДАНИЯ ." До свидания " ; ' ДО-СВИДАНИЯ >BODY >R ПРИВЕТ




Сначала с помощью апострофа выбираем адрес слова ДО-СВИДАНИЯ и помещаем его в стек возвратов - пусть Форт-система «думает», что это адрес возврата. Затем инициируем слово ПРИВЕТ, которое выдает свое приветствие. В конце концов, Форт-система обращается к стеку возвратов за следующим адресом и, выбрав его, выполняет ДО-СВИДАНИЯ - после слова привет:

>BODY

( cfa -- pfa)

Вычисление адреса поля параметров определения, "адрес компиляции " которого находится на стеке.

EXIT

( -- )

Удаление адреса возврата из вершины стека возвратов и занесение его в указатель адресного интерпретатора. Если слово EXIT скомпилировано в определении через двоеточие, то оно завершает выполнение этого определения в данной точке»

QUIT

( -- )

Очистка стека возвратов и передача управления терминалу, ожидающему ввода. Сообщения при этом не выдаются.

ABORT

( -- )

Очистка стека данных и выполнение функций слова QUIT. Сообщения не выдаются.


Содержание раздела