1.4.2. ЛОКАЛЬНЫЕ ПЕРЕМЕННЫЕ

Определим функцию Sq-Sub1, вычитающую из аргумента единицу и возводящую полученное число в квадрат:

Sq-Sub1(X) = (X-1)*(X-1)

Простейшее определение на Рефале имеет вид:

$func Sq-Sub1 sX = sZ;

Sq-Sub1 sX = <"*" <"-" sX 1> <"-" sX 1>>;

Очевидный недостаток такого определения в том, что дважды производятся одни и те же вычисления: а именно, дважды вычисляется выражение <"-" sX 1>. Этого можно избежать посредством введения вспомогательной функции Sq:

$func Sq-Sub1 sX = sZ;

$func Sq sY = sZ;

Sq-Sub1 sX = <Sq <"-" sX 1>>;

Sq sY = <"*" sY sY>;

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

S :: He R

где S - источник, R - хвост, а He - так называемое "жесткое выражение". Жесткое выражение состоит из символов, скобок и переменных и должно удовлетворять следующим ограничениям. Во-первых, He не может содержать два вхождения одной и той же переменной, во-вторых, на каждом уровне скобок может находиться не более одной ve-переменной. Легко видеть, что жесткое выражение является в то же время и форматным выражением, и во время компиляции программы выполняется проверка, что S заведомо вырабатывает результаты, удовлетворяющие формату He.

Тропа S :: He R вычисляется следующим образом. Первым делом вычисляется источник S. Если в результате получается объектное выражение Oe, то переменные из He связываются с соответствующими частями Oe, после чего вычисляется хвост R, и полученный результат считается результатом всей конструкции.

Теперь мы можем записать определение функции Sq-Sub1 следующим образом:

$func Sq-Sub1 sX = sZ;

Sq-Sub1 sX =

<"-" sX 1> :: sY,

<"*" sY sY>;

Обратите внимание, что при вычислении тропы S :: He R источник S вычисляется в той среде, в которой находится вся конструкция. После этого среда пополняется значениями переменных из He, после чего хвост R вычисляется уже в новой, исправленной среде. Таким образом, результатом вычисления тропы

100 :: sX, <"+" sX 1> :: sX = sX

является 101.

В тех случаях, когда жесткое выражение He - пустое, тропа вида S :: R может быть записана в сокращенном виде как S R.

Такая конструкция называется условием и обычно применяется в тех случаях, когда требуется вычислить S не для получения какого-то объектного выражения, а ради побочных эффектов, возникающих при вычислении S. Например, в результате вычисления тропы

<Println "A">, <Println "B">, <Println "C"> =

будет напечатано три строчки, первая из которых будет содержать литеру A, вторая - литеру B, а третья - литеру C.

Если же в присваивании S :: He R хвост R состоит из одной запятой, его можно опустить, в результате чего получается конструкция S :: He.