Основу входного языка системы "Расширенный Рефал" составляет язык Рефал-2 с незначительными изменениями.
Введены также некоторые расширения по отношению к Рефал-2:
Основным множеством знаков, из которых строятся все объекты Расширенного Рефала, являются знаки стандартной части ASCII-таблицы. Возможно также использование русских букв (дополнительная часть ASCII-таблицы в т.н. альтернативной кодировке).
Следующие знаки в программах на Расширенном Рефале имеют особое, фиксированное значение и называются специальными знаками.
Из знаков строятся более крупные единицы - атомы, термы и выражения.
Атомы (т.е. минимальные семантические единицы, нерасчленимые на составные части средствами самого языка) делятся на два класса: объектные знаки и символы.
Любой объектный знак имеет следующий вид:
где [ЗНАК] - произвольный знак, отличный от апострофа. Для изображения знака "апостроф" имеется особое обозначение: '', т.е. два апострофа, идущих подряд (объектные знаки ' ' обозначают не апостроф, а знак "пробел").
Очень часто приходится иметь дело не с отдельными объектными знаками, а с цепочками из нескольких подряд идущих объектных знаков. Для таких случаев предусмотрено сокращенное обозначение. А именно, знаки записываются подряд и вся цепочка заключается в апострофы. Если цепочка знаков содержит апострофы, они изображаются парами апострофов. При этом цепочка, составленная из одних апострофов, удваивается, но апострофами дополнительно не обрамляется.
Любой символ имеет следующий вид:
где [ТЕЛО-СИМВОЛА] - это последовательность знаков, не содержащая знак "/" , имеющая свою структуру для каждого типа символа.
Ниже описаны основные типы символов, имеющие аналоги в Рефале-2. Дополнительные типы символов описаны в следующем разделе.
Символами-метками называются символы, телом которых является идентификатор, т.е. последовательность букв, цифр, знаков "-" и "_", начинающаяся с буквы. Тело символа-метки усекается до первых 8 литер.
Символами-числами называются символы, тело которых представляет собой последовательность десятичных цифр, задающую целое число (возможно, со знаком), модуль которого лежит в диапазоне от 0 до 4,294,967,296 (2**32-1).
Символ-ссылка есть символ, тело которого начинается со знака "%", вслед за которым идут восемь шестнадцатеричных цифр, разделенных по четыре знаком ":". Символы-ссылки нельзя использовать в качестве констант в программах, однако они могут быть порождены в процессе работы программы и входить в обрабатываемые объектные выражения.
В языке Расширенный Рефал имеются также следующие дополнительные типы символов, отсутствующие в языке Рефал-2:
Символ-длинное целое число есть символ, тело которого представляет собой последовательность десятичных цифр, задающую произвольное целое число (возможно, со знаком), модуль которого больше, чем 2**32-1. Заметим, что в Расширенном Рефале целое число произвольной точности всегда является одним атомом.
Следует отметить, что в языке Рефал-2 атомами являлись только целые числа в диапазоне от 0 до 2**24-1 без знака, тогда как короткие целые числа со знаком, а также целые числа, большие 2**24-1, (со знаком или без знака) в Рефале-2 представлялись последовательностями атомов:
Битовая строка есть символ, тело которого начинается с пары знаков "X" и "'", вслед за которой идет последовательность не более восьми шестнадцатеричных цифр.
Например,
/Х'28AF/, /X'FFFFA900/, /X'0/, /X'00FF3/
Символ-текст есть символ, тело которого начинается с пары знаков "Н" и "'", вслед за которой идет последовательность из не более четырех знаков.
Например,
/Н'ABCD/, /H'A@@#/
Вещественное число есть символ, тело которого начинается с пары знаков "F" и "'", вслед за которой идет последовательность знаков, задающая вещественное число с плавающей точкой.
Например,
/F'-123.27734E-23/, /F'232.3435355D-23/
Вещественные числа могут лежать в диапазоне от 3.4Е-38 до 3.4Е+38.
Вещественное число с двойной точностью есть символ, тело которого начинается с пары знаков "E" и "'", вслед за которой идет последовательность знаков, задающая вещественное число с плавающей точкой (с двойной точностью).
Вещественные числа с двойной точностью могут лежать в диапазоне от 1.7Е-308 до 1.7Е+308.
Объектное выражение строится из атомов и структурных скобок "(" и ")". Выражением называется произвольная последовательность атомов и скобок, правильно построенная относительно скобок.
Объектным термом называется выражение, которое представляет собой либо атом, либо объектное выражение, заключенное в структурные скобки.
Таким образом, всякое объектное выражение есть последовательность из некоторого (быть может - нулевого) числа объектных термов.
Приведенные выше определения объектных выражений и объектных термов можно формализовать следующим образом:
Основным (и единственным) управляющим механизмом в языке является вызов функции от единственного аргумента, который представляет собой некоторое объектное выражение. Каждая функция описывает определенное преобразование, в результате которого происходит замена исходного объектного выражения на некоторое другое объектное выражение. Ниже неформальным образом дается представление о семантике вызова функции в Расширенном Рефале.
Функции описывается одним или несколькими предложениями.
Описание функции имеет вид:
где [ИМЯ-ФУНКЦИИ]::=[ИДЕНТИФИКАТОР]
Каждое i-ое предложение описывает один из вариантов замены исходного выражения, и состоит из левой части [L-I] (образец заменяемого выражения) и правой части [R-I] (результат замены), разделенных знаком "=".
Предложения функции имеют следующую семантику:
Процесс сравнения аргумента функции с образцами, заданными в левых частях предложений, называется отождествлением. В результате отождествления определяется первое подходящее предложение, правую часть которого нужно использовать для замены исходного объектного выражения, а также накапливается необходимая информация о составных частях аргумента, которые должны быть использованы в процессе замены.
Синтаксически, левая часть предложения представляет собой типовое выражение, дополненное, возможно, контекстными условиями.
Правая часть представляет собой выражение общего вида.
Синтаксис описания функции может быть формализован следующим образом:
В следующих разделах будут подробно описаны синтаксис и семантика типовых выражений, условных термов и выражений общего вида, а затем синтаксис и семантика функций будут уточнены.
В следующих разделах будет подробно рассмотрена первая фаза работы функции - сопоставление объектного выражения с образцом. Разбирается устройство левых частей предложений Расширенного Рефала, приводится синтаксис типовых выражений и условных термов ограниченного вида (содержащих только условие), а также алгоритм отождествление.
Типовые выражения используются для задания образцов в левых частях предложений. Типовое выражение описывает множество допустимых объектных выражений. Подмножеством типовых выражений являются, таким образом, объектные выражения, задающие множества из единственного элемента.
В типовых выражениях допускается использование переменных. Различаются переменные следующих 4-х типов:
Синтаксически, любая переменная имеет следующий вид:
[ПРИЗНАК-ТИПА] - это один из специальных знаков S, W, V, E либо пусто. Он указывает, к какому из четырех вышеперечисленных типов принадлежит переменная.
[СПЕЦИФИКАЦИЯ] - это описание дополнительных условий, налагаемых на множество допустимых значений переменной. Спецификация может быть пустой. В этом случае считается, что на возможные значения переменной не налагается никаких дополнительных ограничений. В этом случае, значением S-переменной может быть любой атом, значением W-переменной - любой объектный терм, значением V-переменной - любое непустое объектное выражение, значением Е-переменной - любое (в том числе и пустое) объектное выражение.
При задании спецификации переменной при помощи спецификатора выражения признак типа переменной опускается.
[ИНДЕКС] переменной - это уникальное имя данной переменной. Индекс представляет собой одну цифру, либо одну букву. Индексы служат для того, чтобы различать между собой различные переменные. Присутствие индекса при обозначении переменной является обязательным.
Сформулируем теперь определения типового выражения и типового терма.
Типовым выражением называется произвольная последовательность атомов, переменных и структурных скобок, правильно построенная относительно структурных скобок.
Типовым термом называется выражение, которое представляет собой либо атом, либо переменную, либо типовое выражение,заключенное в структурные скобки.
Таким образом, типовое выражение определяется как последовательность типовых термов.
Синтаксис типовых выражений описывается следующим образом:
Непосредственно перед индексом любая переменная имеет спецификацию. Спецификации позволяют накладывать дополнительные ограничения на множества допустимых значений переменных.
Спецификация может иметь одну из следующих форм:
Таким образом, нетривиальная спецификация представляет собой либо имя спецификатора терма, либо имя спецификатора терма в скобках, либо непосредственно спецификатор терма, заключенный в скобки, либо имя спецификатора выражения, заключенное в квадратные скобки "[" и "]".
Имя спецификатора представляет собой идентификатор, заключенный в символы ":".
Спецификаторы позволяют описывать множества объектных выражений, допустимых в качестве значений переменных.
Пусть объектное выражение Е = T1 T2 ... TN, где Тi - объектный терм.
Спецификаторы термов позволяют задавать ограничения на вид термов Ti, составляющих объектное выражение E. Спецификаторы термов соответствуют спецификаторам, используемым в языке Рефал-2. Спецификаторы выражений позволяют описать порядок следования термов Ti в выражении E.
Теперь опишем подробно, какой смысл имеют спецификации для переменных различных типов.
Если у переменной есть несколько вхождений в левую часть, то у каждого вхождения может быть своя спецификация.
Во время отождествления значение каждого вхождения должно удовлетворять спецификации данного вхождения. Таким образом, получается, что множество допустимых значений переменной - это пересечение множеств допустимых значений ее вхождений.
Рассмотрим сначала спецификаторы термов.
Каждый спецификатор термов представляет собой описание некоторого множества термов. Это описание строится исходя из некоторого набора элементарных множеств, которые будут перечислены ниже. Обозначения этих множеств именуются элементами спецификаторов.
Допустимы следующие элементы.
Во-первых, множество, состоящее из одного атома [АТОМ] изображается самим этим атомом. Таким образом, в качестве элемента может использоваться любой атомарный элемент.
Во-вторых, имеется конечное множество стандартных элементов, перечисленных ниже:
Последовательность элементов спецификатора термов, называется цепочкой элементов. Цепочка элементов обозначает объединение тех множеств, которые соответствуют элементам цепочки.
В общем случае спецификатор термов имеет вид:
Р1(Q1)P2(Q2)...PN(QN)P0
где "РК" и "QK"- произвольные (может быть пустые) цепочки элементов спецификатора термов.
Множество значений, изображаемое спецификатором термов, может быть вычислено по следующему алгоритму:
После этого значение спецификатора термов вычисляется рекурсивно следующим образом. Пусть R - это множество термов, изображаемых спецификатором термов
Р2(Q2)...PN(QN)P0
Тогда множество термов, изображаемое спецификатором термов
Р1(Q1)P2(Q2)...PN(QN)P0
вычисляется по формуле
R = P1 + (R - Q1)
где + обозначает объединение множеств, а - обозначает разность множеств.
Рассмотрим теперь спецификаторы выражений.
При описании cтруктуры объектного выражения используется язык регулярных выражений. В качестве основы при описании цепочек используются атомы, стандартные элементы, имена спецификаторов термов, непосредственно спецификаторы термов, заключенные в угловые скобки "<" и ">", имена спецификаторов выражений, а также альтернативы, заключенные в скобки "(" и ")".
Цепочка может быть описана при помощи комбинации основы и повторителя. В качестве повторителя основы используются знаки "*", "+" и "?". Повторитель основы может быть пуст. В этом случае цепочка полностью определяется основой.
Повторитель "+" описывает непустую цепочку составленную конкатенацией максимально возможного числа цепочек, заданных соответствующей основой. Отличие повторителя "*" заключается в том, что описываемая цепочка может быть пустой. Повторитель "?" описывает либо пустую цепочку, либо цепочку, заданную соответствующей основой.
Различаются элементарные и составные основы цепочек. К числу элементарных относятся основы, задаваемые атомом, стандартным элементом спецификатора, именем спецификатора терма, либо непосредственно спецификатором терма. К числу составных относятся основы, задаваемые именем спецификатора выражения, либо альтернативой.
Элементарная основа всегда описывает цепочку, состоящую ровно из одного терма. Использование составных основ позволяет строить описания произвольных цепочек регулярной структуры.
Формально, приведенные выше описания спецификаторов могут быть упорядочены следующим образом:
В языке Расширенный Рефал существует возможность задания в левой части предложения дополнительных контекстных условий на значения переменных. Для этого используется конструкция, называемая условный терм. Условным термом будем называть нечто, заключенное в фигурные скобки "{" и "}". Содержимое фигурных скобок будем называть телом условного терма.
В левых частях допустимо использование ограниченных условных термов, тело которых содержит только условие. Эта разновидность условных термов будет описана в данном разделе. Полные условные термы, тела которых содержат так называемые селекторы, будут подробно описаны ниже.
Если в левой части заданы контекстные условия, то по мере сопоставления аргумента функции с образцом, заданным типовым выражением из левой части, проверяется истинность условий, заданных ограниченными условными термами. Ложность условия
приводит к поискам других вариантов сопоставления аргумента с образцом.
Условия задаются логическими выражениями, при построении которых можно пользоваться логическими константами <T> (истина) и <F> (ложь), предикатами LT, LE, EQ, GE, GT и IN, а также операциями AND, OR и NOT.
Рассмотрим используемые в языке предикаты более подробно.
Предикат IN принимает значение "истина" в том случае, если значение переменной принадлежит множеству объектных выражений, определенных ее спецификацией. Очевидно, что если спецификация переменной пуста, то предикат также принимает значение "истина". Объектное выражение в предикате IN должно быть пустым.
Предикаты LT (меньше), LE (меньше или равно), EQ (равно), GE (больше или равно) и GT (больше) сравнивают значение переменной, заданной в качестве первого терма аргумента, с объектным выражением, заданным остальными термами аргумента. При этом значения "истина" или "ложь" принимаются в зависимости от того, выполнено требуемое соотношение, или нет.
Зафиксирован следующий алгоритм сравнения объектных выражений. Объектные выражения сравниваются по термам слева направо. Упорядоченность устанавливается по первой же паре различных термов. В том случае, когда одно из выражений исчерпалось, а пары различных термов не нашлось, меньшим считается более короткое выражение.
Термы различных типов упорядочены следующим образом (использованы стандартные элементы спецификаторов термов):
N < I < E < V < O < R < F < H < X < B
Символы-числа упорядочены по их величинам (с учетом знака); объектные знаки - по их кодам в ASCII таблице; символы-тексты - сравнением их по знакам слева направо (аналогично сравнению самих объектных выражений); упорядоченность символов-меток и символов-ссылок не определена; скобочные термы упорядочены в соответствии с упорядоченностью объектных выражений внутри скобок.
На использование условий наложено следующее ограничение: все переменные, входящие в условие, должны на момент вычисления условного терма уже получить некоторое значение. Для определения того, какие из переменных получили некоторое значение в тот или иной момент выполнения отождествления, необходимо представлять алгоритм отождествления, который будет описан в следующем разделе.
При задании контекстных условий используются также логические операции AND (и), OR (или) и NOT (не), определенные над логическими выражениями.
Синтаксис условных термов следующий:
В данном разделе подробно описан алгоритм отождествления, принятый в Расширенном Рефале.
Рассмотрим вызов функции <F E0>, где F-имя функции, а ее аргумент E0 - объектное выражение. Пусть функция F описана набором предложений [L-i]. Для определения подходящего предложения осуществляется последовательный перебор предложений и делаются попытки сопоставления [L-i] и E0.
Рассмотрим некоторую левую часть E, заданную последовательностью типовых и условных термов:
L=T1 C1 T2 C2 ... Tn Cn, где Ti-типовые термы, а Ci-условные термы.
Выделим соответствующее типовое выражение T=T1 T2 ... Tn и совокупность контекстных условий C=U Ci (объединение всех Ci).
Определение: Объектное выражение E0 может быть отождествлено с левой частью L как типовое выражение T при условиях C, если всем переменным, входящим в T могут быть поставлены в соответствие объектные выражения (называемые их значениями), таким образом, что полученное выражение будет совпадать с E0, а результатом всех Ci будет "истина". При этом значением S-,W-,V- и E-переменных может быть соответственно только символ, терм, непустое выражение или произвольное выражение, входящие в множество допустимых значений спецификации данной переменной. Значения повторных вхождений переменной с одним и тем же индексом должны совпадать.
Возможные неоднозначности, связанные с определением значений V- и E-переменных устраняются следующим образом.
Введем понятие длины объектного выражения. Длину пустого выражения примем за нуль, а длину непустого выражения будем определять следующим образом:
если E=t1 t2 ... tn , где ti - объектный терм, то длина E есть n.
Тогда, значения V- и E-переменных будем подбирать таким образом, чтобы значения меньшей длины принимали переменные, соответствующие в L типовым термам Ti с меньшими i.
В следующих разделах будет рассмотрена вторая фаза работы функции - замена исходного объектного выражения на новое, при построении которого могут быть использованы значения переменных из соответствующей левой части. Разбирается устройство правых частей предложений Расширенного Рефала, приводится синтаксис выражений общего вида и полных условных термов (содержащих селекторы), а также правила построения результата замены функции по выражению общего вида.
Рассмотрим устройство правой части предложения в Расширенном Рефале. Как уже было отмечено выше, правая часть представляет собой выражение общего вида. По аналогии с объектными и типовыми выражениями, выражение общего вида есть последовательность термов общего вида.
Переменные, входящие в правую часть должны по типу и индексу совпадать с переменными из левой части того же предложения. При формировании результата замены вместо вхождения переменной в выражение будет подставлено значение соответствующей переменной, полученное на первой фазе работы функции в результате сопоставления аргумента с образцом. Повторные вхождения в правую часть переменной с одним и тем же индексом может приводить к копированию значения этой переменной.
В правых частях предложений могут быть использованы полные условные термы, т.е. условные термы, тело которых содержит селектор.
Селекторы задают упорядоченную последовательность пар "условие - выражение". В процессе замены значения условий вычисляются в порядке следования пар. Если встретится условие, значение которого "истина", то значением всего селекторастановится соответствующее выражение из данной пары. Если все условия имеют значение "ложь", значением селектора считается пусто.
Селекторы позволяют объединять несколько предложений, структуру левых частей которых можно представить одинаково, с использованием обобщающих понятий.
Синтаксис селекторов можно формализовать следующим образом:
На использование селекторов наложено следующее ограничение: вложенные селекторы не допускается, т.е. выражение общего вида в теле полного условного терма не должно в свою очередь содержать условные термы ни на одном уровне вложенности термов общего вида. Таким образом, выражение, которое получается в качестве значения условного терма, может содержать только объектные и функциональные термы.
B правых частях предложений Расширенного Рефала для вызовов функций используются следующие обозначения:
Т.е. вызов функции есть выражение общего вида, заключенное в функциональные скобки "< "и ">", причем непосредственно после левой функциональной скобки должно идти имя функции.
Допускаются "неявные" вызовы функций, когда считается, что имя вызываемой функции будет представлено некоторым символом-меткой, который окажется первым термом аргумента функции в момент ее вызова. Это позволяет передавать имя функции в качестве значения одной из переменных. В случае неявного вызова функции после левой функциональной скобки должен идти хотя бы один пробел.
Для обеспечения совместимости с другими реализациями Рефала в программах вместо знака "<" разрешается использовать знак "K", а вместо знака ">" - знак ".". При использовании знаков "K" и "." в качестве имени функции после левой функциональной скобки должен идти символ-метка, т.е. имя функции обрамленное знаками "/".
Семантика вызовов функций следующая. В отличии от других языков программирования, все новые вызовы функций вместо немедленного выполнения, откладываются до окончания формирования результата замены текущей функции. После этого выбирается ведущий функциональный терм, т.е. самый левый функциональный терм, не содержащий внутри себя других функциональных термов, и выполняется функция заданная данным термом. Очевидно, что внутри функциональных скобок "<" и ">" заключено некоторое объектное выражение, а все рабочее выражение (которое называется поле зрения) представляет собой последовательность объектных и функциональных термов, причем внутри функциональных скобок могут находиться только объектные и функциональные термы. Когда рабочее выражение содержит только объектные термы, выполнение программы завершается. Считается, что перед началом работы программы рабочее выражение содержит единственный функциональный терм:
Таким образом, работа программы заключается в последовательной трансформации различных частей рабочего выражения и разбивается на шаги, каждый из которых состоит из
1. Поиска ведущего функционального терма;
2. Отождествления аргумента функции;
3. Замены в рабочем выражении всего ведущего функционального терма на результат замены функции;
Будем различать понятия результат функции и результат замены. Результат функции есть объектное выражение, не содержащее внутри себя функциональных термов.
Результат замены есть объектное выражение, содержащее, возможно, новые вызовы функций, т.е. функциональные термы. Результат замены есть непосредственный результат одного применения функции. И в том случае, если он не содержит новых вызовов функций, он совпадает с результатом всей функции. В общем случае, однако, для получения результата функции может потребоваться выполнить все вложенные вызовы (в том числе допустимы и рекурсивные вызовы). Итак, содержимое одного шага выполнения программы на Расширенном Рефале составляет вызов функции и получение результата замены. Для получения результата функции может потребоваться, таким образом, несколько шагов.
Программа на языке Рефал представляет собой описание некоторого набора функций и спецификаторов. Программа может быть разбита на несколько независимых модулей.
Модуль представляет собой последовательность описаний и комментариев. Комментарием считается строка, начинающаяся со знака "*". Комментарии могут появляться в любом месте модуля.
Описанием считается строка, начинающаяся с любого знака, отличного от "*".
Описания имеют следующий вид:
Информация, содержащаяся в описании зависит от типа описания.
Присутствие всех трех компонентов описания необязательно. Часть из них (или даже они все) могут быть пустыми. Идентификатор должен начинаться с первой позиции строки, а остальные компоненты отделяться друг от друга хотя бы одним пробелом. Если идентификатор в начале строки опущен, в начале строки должен находиться хотя бы один пробел. Описание, в котором отсутствуют все три компоненты (т.е. строка, состоящая из одних пробелов), игнорируется. Ключевое слово описания, если оно присутствует, не должно быть разорвано признаком переноса.
Модуль должен начинаться с заголовка (описание с ключевым словом START) и заканчиваться описанием с ключевым словом END.
Эти описания имеют следующий вид:
где [ВНЕШНЕЕ-ИМЯ] - цепочка латинских букв и цифр длины не более 8, начинающаяся с буквы. Если внешнее имя оказывается длиннее 8, то оно усекается до 8 знаков.
Основным типом описания являются описания функций и спецификаторов. Описание функции представляет собой совокупность предложений, каждое из которых должно начинаться с новой строки. Первое предложение содержит имя функции. Описанию функции соответствует пустое ключевое слово.
Функции и спецификаторы, описанные в разных модулях могут вызывать друг друга. Если в некотором модуле используется функция или спецификатор, описаные в другом модуле, о они должны быть объявлены в данном модуле с помощью описания EXTRN. В модуле, где находится описание данной функции или спецификатора, они должны быть дополнительно объявлены как входные точки с помощью описания ENTRY.
Описания EXTRN и ENTRY имеют следующий вид:
При объединении модулей в программу используется внешнее имя функции, тогда как внутри модуля эта функция может называться по-другому. Таким образом, при разработке программы одна и та-же функция может называться по-разному в разных модулях. Следует отметить, что в программе, составленной из нескольких модулей все внутренние имена функции в модулях, где она описана как EXTRN, теряются, а ее именем становится внутреннее имя из модуля, в котором она описана как ENTRY.
Кроме рефал-функций в программах на Расширенном Рефале могут использоваться внешние функции (машинные операции).
С точки зрения пользователя отличие внешних функций от функций, написанных на Расширенном Рефале, состоит в том, что описания внешних функций содержатся в библиотеке внешних функций (т.е. вне программы пользователя), а также в том, что внешние функции всегда полностью выполняются за один шаг, т.е. результат внешней функции совпадает с ее результатом замены.
С помощью внешних функций производятся манипуляции с атомарными элементами, а так-же действия, при выполнении которых требуются побочные эффекты.
Функции объявляются внешними в описании SYSTEM:
Следует отметить, что такое описание должно быть в каждом модуле, где используются внешние функции.
Рассмотрим прочие правила записи предложений более подробно.
Каждое предложение записывается с новой строки. Имя функции должно стоять в начале строки, а перед началом левой части предложения должен быть хотя бы один пробел. Строка не должна быть длиннее 80 символов.
Элементами предложения являются следующие объекты: цепочка объектных знаков (заключенная в апострофы), символ, (заключенный в слэши), переменная, знаки
<, >, (, ), =, {, }, : и знак ;.
Между любыми двумя элементами предложения разрешено вставлять произвольное число пробелов. Кроме того, пробелы можно вставлять между элементами спецификатора и скобками, входящими в спецификатор.
Любое предложение может быть перенесено на следующую строку.
Признаком переноса является знак "+" в любом месте строки, в котором допустимы пробелы.
Обменные функции предоставляют программисту возможность сохранять историю процесса вычисления (нарушая тем самым аппликативный стиль языка). Считается, что с каждой обменной функцией связано некоторое запоминающее устройство - ящик. Каждый ящик может содержать произвольное объектное выражение.
Обменные функции объявляются следующим образом:
Рассмотрим следующий вызов обменной функции FUNC:
<FUNC [НОВОЕ-ВЫРАЖЕНИЕ]> , где [НОВОЕ-ВЫРАЖЕНИЕ]- аргумент функции.
В результате применения обменной функции к выражению [НОВОЕ-ВЫРАЖЕНИЕ], в поле зрения попадет выражение [СТАРОЕ-ВЫРАЖЕНИЕ] - содержимое ящика на момент обращения к нему, а выражение [НОВОЕ-ВЫРАЖЕНИЕ] удаляется из поля зрения и становится новым содержимым ящика.
Перед началом работы рефал-программы все ящики содержат пустые выражения.
Иногда может оказаться полезным описать функцию с нулевым числом предложений (строка, содержащая только идентификатор с начала строки). Очевидно, что выполнить данную функцию невозможно, однако ее имя представляет собой некоторый удобный уникальный символ.
Альтернативным способом описания пустых функций может быть следующий: