СТЕКОВАЯ НОТАЦИЯ
Передачу аргументов определениям легко и удобно производить через стек1. Но при пользовании стеком вся ответственность за соответствие его состояния так называемой «стековой нотации» ложится на вас. Иными словами, при определении некоторого слова вы должны представлять себе, какие аргументы это слово при своем выполнении выбирает из стека, а какие в нем оставляет или «возвращает», и при выполнении слова убедиться в том, что в действительности так и происходит.
Применительно к нашему простому примеру ПЛЮС-ЧЕТЫРЕ изложенное выше означает, что перед выполнением указанного слова в стеке должен находиться один аргумент, а после его вы-
' Для знатоков семантики. В математике слово аргумент ассоциируется с независимой переменной некоторой функции. Компьютерные лингвисты заимствовали этот термин для обозначения значений, передаваемых функциям или подпрограммам. Кроме того, для описания аналогичных объектов используется слово параметры.
полнения оставаться результат в виде одного значения. Если вы поместите внутри определения ПЛЮС-ЧЕТЫРЕ «точку» для вывода получаемого результата на дисплей, то изменится стековый эффект: данное слово не должно будет возвращать в стек значение, полученное в результате своего выполнения.
Чтобы иметь возможность визуально согласовывать стековые эффекты при выполнении различных слов, программисты применяют специальную запись — стековую нотацию. Такой комментарий обязательно должен присутствовать в программных листингах и глоссариях (вид документации, в которой содержатся перечни слов, используемых в вашей прикладной программе). Прежде чем показать вам, как выглядит стековая нотация, обсудим вопрос о том, что представляют собой комментарии в Форте.
Комментарий — это некоторая информация, предназначенная только для человека: она ни выполняется, ни компилируется. В Форте слово ( , левая круглая скобка, символизирует начало комментария. Текстовому интерпретатору предписывается осуществлять пропуск последующего текста до тех пор, пока не встретится правая круглая скобка, означающая конец комментария.
Поскольку ( является словом, вы обязаны отделять этот символ пробелом так же, как и в случае применения слова ."1.
Вы можете использовать обычный комментарий внутри некоторого определения следующим образом: : НИЧЕГО ( это слово ничего не выполняет ) ;
Текст «это слово ничего не выполняет» является комментарием. Вернемся к стековой нотации. Основной формат комментария этого вида выглядит так: ( -- )
1 Для начинающих. Закрывающая круглая скобка не является словом. Это просто символ, который служит ограничителем для слова ( . (Вспомните, что для слова ." ограничителем является символ ")
Такой комментарий означает, что данное определение никакого эффекта на стек не оказывает. К словам подобного рода относится CR или специфицированное нами слово STAR. (Во время своего исполнения слово STAR помещает в стек число 42, но извлекает его из стека до завершения работы, так что стековых эффектов в рассматриваемом случае нет.) Принято отделять стековую нотацию от имени определения двумя пробелами: : STAR ( -- ) 42 EMIT ;
Напоминаем, что стековая нотация ничего не значит для Форта, но очень помогает программисту, пытающемуся разобраться в конкретной программе.
Если некоторое слово должно выбрать из стека аргументы, то эти аргументы перечисляются слева от двойного дефиса. Например, стековая нотация для слова . («точка») выглядит следующим образом: ( n -- )
(Буква n заменяет число.) Если слово возвращает стеку аргументы, то они перечисляются справа от двойного дефиса. Стековая нотация для слова + имеет вид:
( n1 n2 — сумма )
Для обозначения аргументов вы можете использовать имена, сокращения или просто нумеровать их: nl, n2, nЗ и т. д., как было сделано в приведенном выше примере.
Когда вы указываете несколько аргументов справа или слева от дефиса, необходимо строго соблюдать порядок их размещения. Запомните следующее правило: крайний правый объект в стековой нотации является верхним элементом стека.
Это легко запоминается, поскольку перечисление аргументов в стековой нотации совпадает с порядком их ввода.
Если вы вводите в стек для некоторого слова числа 1 2 3, то стековый комментарий будет таков: ( 1 2 3 -- )
т е. 1 окажется на дне, а 3 - в вершине стека.
Так как вы, очевидно, уже разобрались в правилах записи, в дальнейшем будет опускаться <return>, за исключением тех случаев, где это необходимо для ясности. Ответы компьютера в книге всегда подчеркнуты, поэтому вам должно быть понятно, когда следует нажимать клавишу RETURN.
Ниже приводится список слов Форта, которые вам уже знакомы, вместе с их стековой нотацией (n замещается числом, с — символом)
: ххх уyу ; ( — ) Определение нового слова с именем ххх, состоящее из слова или слов ууу. CR ( — ) Возврат каретки и перевод строки. SPACES ( n — ) Вывод заданного числа пробелов. SPACE ( — ) Вывод одного пробела. ЕMIТ ( с — ) Вывод символа. ." ххх" ( — ) Вывод строки символов ххх. Символ " является признаком конца строки. + ( nl n2 — сумма ) Суммирование.
. ( n — ) Вывод числа, за которым следует один пробел. ( xхх) ( — ) Комментарий, который текстовым интерпретатором не воспринимается. Символ ) является ограничителем.
В следующем разделе мы расскажем вам о том, как заставить компьютер выполнять более сложные арифметические операции