Язык программирования Форт



         

Слова для манипуляций в стеке - часть 5


В Форт-79 принято, что верхний элемент стека имеет номер 1, а в Форт-83 -- номер 0. Таким образом, в стандарте Форт-83 выражение

0 PICK

приводит к такому же результату, что и DUP, в то же время для Форт-79 стандартное слово DUP эквивалентно

1 PICK

Если ввести 0 PICK, в стеке окажется какая-нибудь чушь. Таким образом, PICK, доставая число из глубины стека, не производит в нем других изменений.

Слово ROLL похоже на PICK, но в отличие от него вынимаемое число при перемещении его на вершину на старом месте удаляется. Например, в стандарте Форт-79

1 2 3 4 5 6 5 ROLL .S

приведет к

1 3 4 5 6 2 Ok

в то же время та же операция в стандарте Форт-83 приведет к другому результату:

2 3 4 5 6 1 ok

Нумерация элементов в стеке в стандартах Форт-79 и Форт-83 отличается для оператора ROLL так же, как и для PICK. Эти различия в стандартах важно учитывать при переносе программ из одной версии в другую. Слова ROLL и PICK следует применять, если невозможно использовать ничего другого, так как они работают значительно медленнее, чем DUP, OVER и ROT (эти три слова определены не с помощью слов PICK и ROLL, а непосредственно в машинных кодах). К тому же слово ROLL работает значительно медленнее, чем PICK. Чтобы избежать путаницы, нужно держать в стеке не более четырех чисел, которые используются в данном слове, и, если вы будете придерживаться этого правила, вам редко потребуются слова PICK и ROLL.

А сейчас будет уместно сделать небольшой экскурс в стандарты языка Форт. Как уже указывалось во введении, существуют два известных стандарта -- Форт-79 и Форт-83. Ссылки на основные документы, описывающие стандарты, приведены в приложении В. Различия между стандартами зачастую невелики, однако имеют значение, как, например, в случае ROLL и PICK, и мы обратим на это ваше внимание, когда будем встречаться с этими различиями. Версия, с которой вы работаете, должна соответствовать одному из стандартов, и вы можете определить, какому именно, если введете 79-STANDARD или FORTH-83. Если без ошибки будет принято первое слово, то ваша версия совместима с Форт-79, если же без ошибки будет принято последнее слово, ваша версия соответствует стандарту Форт-83.

Слово ?DUP представляет собой специальный вариант слова DUP. Оно делает копию числа, находящегося на вершине стека, если оно не равно нулю, и не копирует число, если оно равно нулю, Например,

1 4 5 ?DUP .S

дает в стеке

1 4 5 5 ok,

в то время как

1 4 0 ?DUP .S

приводит в результате к

1 4 0 ok

Таким образом, в последнем случае слово ?DUP не производит никаких действий. Оно особенно полезно вместе с конструкцией IF...THEN, примеры этого будут приведены в последующих главах.

Последнее слово в , DEPTH, не производит никаких перестановок в стеке. Вы уже встречали его в . Оно подсчитывает количество чисел в стеке и выдает его на вершину стека. Если ввести

21 131 56 7 89 DEPTH

мы получим

5 ok

где 5 -- это число элементов, находившихся в стеке перед исполнением слова DEPTH. Мы увидим еще применение слова DEPTH в последующих упражнениях.




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