1. Описание языка рефал
Преподавание программирования - дело почти безнадежное, а его изучение - непосильный труд. Ч.Уэзерелл "Этюды для программистов",1982.
Имеется несколько способов изложения теоретических основ языка рефал. В настоящих указаниях определения пунктов 1, 3, 4, 6, 7 соответствуют работе [3]. Часть задач и примеров взяты из работ [2] , [3] , другая часть относится к рефальскому фольклору, и установить авторство многих задач или их элегантных решений не представляется возможным. Поэтому мы приводим все задачи без каких-либо ссылок и не претендуем на оригинальность в тех случаях, когда нам кажется, что задача сформулирована впервые.
Знаки, символы, переменные
Язык рефал ориентирован на работу с символьными данными. Основными объектами, с которыми работает рефал, являются символы.
Символы бывают простые и составные.
Простой символ - это обычный символ. При записи программы простой символ обрамляется апострофами, за исключением самого апострофа - он просто удваивается.
Составной символ - это либо составной символ-метка (детерминатив, имя функции), либо составной символ-число - макроцифра.
Составной символ-метка - это последовательность букв, цифр и знаков '-' , '_' , которая начинается с большой буквы. Длина составного символа-метки не ограничивается.
Составной символ-число (макроцифра) - это последовательность цифр, число. Число записывается в обычной десятичной системе счисления. Максимальное значение числа равно 2^32 - 1.
Заметим, что хотя для записи составного символа End требуется три знака, для записи макроцифры 1999 - четыре знака, а для записи простого символа 'A' - три знака, но с точки зрения языка рефал во всех случаях мы имеем дело лишь с одним символом. Другими словами, конструкции End , 1999 , 'A' составляют одно целое и не могут быть расчленены.
Последовательности символов
Последовательность символов - это несколько символов, идущих подряд. При записи последовательности простых символов в программе они разделяются пробелами:
'А' 'В' 'С' - последовательность из трех символов - "А", "В", "С",
1 0 - последовательность из двух макроцифр I, 0 .
Ясно, что такой способ записи последовательности простых символов является неэкономным.
Последовательность простых символов - строка символов - может быть записана короче:
'А+В' - строка из трех символов - "А", "+", "В".
'А''В' - строка из трех символов -"А", апостроф, "В".
'''' - строка из двух символов - апостроф, апостроф.
Итак, в последовательности знаков, изображающей строку символов, знак апостроф встречается четное количество раз. Каждая пара рядом стоящих знаков апостроф, при просмотре слева направо, изображает один символ апостроф.
Объектное выражение
Объектное выражение - это выражение, состоящее из символов, а также из левых и правых структурных скобок "(" и ")". Скобки должны образовывать правильную скобочную структуру (в обычном "школьном" понимании). Выражение может быть, в частности, и пустым. Знаки "пробел", не входящие в последовательность простых символов, служат для внешнего оформления программы.
Переменные символа, выражения, терма
Переменные символа, выражения, терма служат для описания различных множеств объектных выражений.
Переменная символа записывается так: знак "s" и сразу за ним индекс переменной - буква, цифра, или символ "точка", за которым следует любая последовательность... ???
Переменная выражения записывается так: знак "e" и сразу за ним - индекс переменной.
Переменная терма записывается так: знак "t" и сразу за ним - индекс переменной.
Например, sa , e1 , e.1 . e.String , s.N1 .
Правила использования индексов будут описаны ниже в п.3.
Опишем теперь, какие значения могут принимать переменные. Переменная символа может принимать значение одного символа (любого).
Переменная выражения может принимать значение любого объектного выражения.
Переменная терма может принимать значение любого т е р м а, т.е. либо одного символа, либо одного объектного выражения, заключенного в структурные скобки.