Здравствуйте.
Поскольку здесь замечен интерес к Рефал-5λ Александра Коновалова, хочу сказать пару слов о языке и поделиться своей упрощённой реализацией, которая написана под впечатлением от работ Александра (у него несколько компиляторов).
Прежде всего, язык основан на идее нормальных алгорифмов Маркова. Это один из общепринятых способов (наряду с Машиной Тьюринга и Лямбдой Чёрча) формализации алгоритма. В современных языках реализован как сопоставление с образцом (pattern-matching). Базисный Рефал и состоит из одних сопоставлений (расширенный Рефал-5 подслащен условиями и блоками). Этого достаточно, что бы написать компилятор Рефал (например Refal-05). Рефал позволяет обходиться без компиляторов БНФ-нотаций в привычные языки программирования.
Рефал-5 по В.Ф. Турчину определён со следующими привязками к английскому и латинской раскладке:
1. английские имена функций стандартной библиотеки;
2. префикс в именах переменных определяет их тип и является латинской буквой с последующей точкой (s. e. или t.);
3. вызовы функций заключаются в вычислительные скобки: < >
4. блоки (тела функций) — в скобки фигурные { }.
Имена функций изменить не проблема. К буквенным префиксам добавил аналог из знаков препинания. Вместо s. (сопоставляется одному символу) можно писать ?, вместо e. (сопоставляется произвольному количеству символов) — точку или многоточие, и ! вместо t. (терм - либо один символ, либо выражение в () скобках). Что делать с угловыми и фигурными скобками, пока не ясно, оставил как есть. Нач/кон вместо { } по смыслу подходят не очень (т.к. имитируется подобие системы уравнений из математики, а не императивная последовательность).
Ослабил требования к именам идентификаторов, могут включать спецсимволы (в оригинале имя может включать минус или подчёркивание). Сам язык разрешает определять идентификаторы в произвольном месте неявно (интерпретатор выводит предупреждение), наряду с использованием их в образце (для сопоставления) позволяет эмулировать имена функций, которые включают пробел. Что позволяет уйти ВотОтЭтого-и-этого. Кроме того, имя функции в моей реализации не обязательно писать перед её аргументами. Порядок слов в русском языке произволен.
Вот пример простейшей программы:
// Допустимы комментарии в одну строку в стиле С++ * Вариант классической РЕФАЛ-программы. Начало = <Палиндром? <удалить пробелы "я разуму уму заря ">> <Палиндром? <удалить пробелы "я иду съ мечемъ судия">>; * Гавриил Державин Палиндром? { ?символ … ?символ = <Палиндром? …>; ?символ = <Вывод "Палиндром">; = <Вывод "Палиндром">; … = <Вывод "Остаток: "…>; } удалить { пробелы .символы " " .остаток = <удалить пробелы .символы .остаток>; пробелы … = …; } * явное определение не обязательно. пробелы; Вывод { . = <Prout .> }
Интерпретатор минималистичен и реализован целиком на Си, задуман как встраиваемый. Пока работает под Linux (пригоден для запуска сценариев на Рефал в командной строке). Слабонервным исходники транслятора (в байткод для исполнителя) смотреть не стоит, это одна функция в 1500 строк, из которых 171 goto и 259 case.
Благодарю за внимание.
Отредактировано С.Т. (2021-03-20 15:28:38)