1.3.1. РЕЗУЛЬТАТНЫЕ ВЫРАЖЕНИЯ

Результатные выражения в языке Рефал являются аналогом общеизвестных арифметических выражений. Так, например, арифметическому выражению X*Y+3 в Рефале Плюс соответствует следующее результатное выражение:

<"+" <"*" sX sY> 3>

Угловые скобки обозначают вызов функции. Причем первый символ-слово после левой угловой скобки обозначает имя функции, а все остальное соответствует аргументом функции. Благодаря тому, что аргумент функции всегда явно заключается в угловые "функциональные" скобки, отпадает необходимость использовать круглые скобки для группировки операций. Например, выражение X*(A+B) на Рефале записывается как

<"*" sX <"+" sA sB>>

в то время как выражение X*A+B на Рефале записывается в виде

<"+" <"*" sX sA> sB>

Результатные выражения, как и арифметические выражения в других языках, используются для получения одних значений из других. А именно, при вычислении результатного выражения все входящие в него переменные заменяются на их значения, после чего вычисляются вызовы всех функций. При этом, если вызовы функций вложены друг друга, то сначала вычисляются более внутренние вызовы.

Ясно, что, результатное выражение можно вычислить только в том случае, если заданы значения для входящих в него переменных. Информацию о значениях переменных мы будем называть средой.

Запись

{V1 = Oe1, ..., Vn = Oen}

будет изображать среду, в которой переменные V1, ..., Vn имеют значения Oe1, ..., Oen соответственно.

Ясно, что запись арифметических выражений в виде результатных выражений довольно громоздка, однако, как мы увидим в дальнейшем, у нее есть и определенные преимущества. Дело в том, что выбор той или другой системы обозначений определяется природой тех объектов, с которыми мы собираемся иметь дело, а также набором операций, которые должны применяться к этим объектам.

Желательно выбирать такие обозначения, чтобы те операции, которые встречаются чаще всего, записывались бы как можно короче. Ясно, что самым кратким обозначением операции является отсутствие всякого обозначения, т.е. пустое место. В случае арифметических выражений мы имеем две основных операции: сложение и умножение, и одну из них можно обозначить пустотой. Так обычно и поступают, опуская знак умножения.

В случае языка Рефал, основным объектом работы являются не числа, а объектные выражения, для которых имеется две основных операции: конкатенация (сцепление) двух выражений и заключение выражения в скобки. Синтаксис Рефала построен таким образом, чтобы эти операции имели кратчайшие обозначения. А именно, если у нас имеются два результатных выражения Re' и Re'', то запись

Re' Re''

тоже является результатным выражением, которое означает, что надо вычислить Re' и Re'', а полученные результаты сцепить вместе. Т.е. если результатом вычисления Re' и Re'' являются объектные выражения Oe' и Oe'' соответственно, то результатом вычисления Re' Re'' является объектное выражение Oe' Oe''.

Если у нас имеется результатное выражение Re, то запись

( Re )

тоже является результатным выражением, которое означает, что надо вычислить Re, а полученный результат заключить в круглые скобки. Т.е. если результатом вычисления Re является объектное выражение Oe, то результатом вычисления ( Re ) является ( Oe ).

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

sX '+' sY (eZ)

в среде {sX = 25, sY = 36, eZ = A (B C) D} является объектное выражение

25 '+' 36 (A (B C) D)