РЕкурсивных Формул АЛгоритмический является одним из старейший языков программирования. Создал его в 60-х годах прошлого столетия Валентин Фёдорович Турчин. С тех пор вышел ряд отличающихся синтаксисом и семантикой версий. Интересующимся рекомендуется ознакомиться со сравнением, которое составил ведущий разработчик компилятора Рефал-5λ Александр Коновалов.
РЕФАЛ-машина предназначена для исполнения написанных на РЕФАЛ сценариев (поддерживается пока только Базисный РЕФАЛ, за исключением нескольких встроенных функций) в ОС Linux. Реализована на яыке Си и имеет минимум зависимостей (в том числе от стандартной библиотеки Си). Представляет собой (потенциально) встраиваемый интерпретатор, предварительно транслирующий исходный текст в байт-код, который и исполняется. Трансляция выполняется в один проход, однако, поддерживается традиционный для РЕФАЛ произвольный порядок определения функций.
Основные отличия:
-
Поддержка кириллицы (и практически любых Уникод-сомволов) в идентификаторах.
-
Префиксы
s.
t.
иe.
переменных могут быть соответственно?
!
и.
или…
-
Начинающиеся с
$
директивы не поддерживаются. -
В вычислительных скобках
< >
имя вызываемой функции не обязательно должно идти непосредственно после открывающей скобки, перед ним можно расположить данные или простой идентификатор. Транслятор знает, что можно вызвать. Это же послабление относится и к функцииMu
, которая выполняет поиск вызываемой функции среди аргументов во время выполнения (пропуская структурные скобки). -
Помимо точки входа
Go
возможно использоватьMain
, которая принимает в поле зрения аргументы командной строки (каждый заключён в структурные скобки, как в результатеArgList
из LibraryEx). Кроме того, поддерживается точка входаНачало
— в таком случае интерпретатор проверяет, содержит ли первое её предложение образец, надо ли передавать аргументы. Допустимы вышеперечисленные имена, начинающиеся со строчной буквы — результат их исполнения выводится, а не отбрасывается. -
Поддержаны функции из одного предложения, без блока
{ }
.// Допустимы комментарии в одну строку в стиле С++ * Вариант классической РЕФАЛ-программы. Начало = <Палиндром? <удалить пробелы "я разуму уму заря ">> <Палиндром? <удалить пробелы "я иду съ мечемъ судия">>; * Гавриил Державин Палиндром? { ?символ … ?символ = <Палиндром? …>; ?символ = <Вывод "Палиндром">; = <Вывод "Палиндром">; … = <Вывод "Остаток: "…>; } удалить { пробелы .символы " " .остаток = <удалить пробелы .символы .остаток>; пробелы … = …; } * явное определение не обязательно. пробелы; Вывод . = <Prout .>;
Для вызова функций, реализованных в другой единице трансляции (модуле), следует импортировать модуль явно. Для чего указывается имя модуля, завершаемое двоеточием:
Модуль: функция1 функция2;
РЕФАЛ-машина ищет реализацию модуля в файлах Модуль.реф
и Модуль.ref
.
Указанные в команде импорта идентификаторы вносится в текущую область пространства
имён. Остальные идентификаторы модуля так же доступны, если их имя предварительно
квалифицировать именем модуля:
* Импортируем идентификаторы тест1 и тест2 из файла "Модуль1.реф"
Модуль1: тест1 тест2;
go = <тест1> <тест2>
* Вызов по полному имени.
<Модуль1 тест3>;
На текущем этапе РЕФАЛ-машина способна исполнить Refal-05 (после внесения изменений). Оптимизация интерпретатора не производилась, потому придётся подождать. Транслятор наверняка выдаст неожиданный результат, если предложить ему некорректный исходный текст.