Бойко!

Статья Столярова это просто первое, что мне пришло в голову по Вашему письму. 
Поскольку сначала я не до конца понял, что Вы имели ввиду.

Сейчас немного подумал и вот что придумал. Некоторые существенные особенности 
Рефала:
• Объектное выражение — последовательность с правильно расставленными скобками, 
допускающая чтение с обоих концов и конкатенацию. Объектное выражение состоит 
из термов — или символов (атомов), примитивных элементов, или скобочных термов 
— объектных выражений, заключённых в круглые скобки. 
• Рефальское сопоставление с образцом.
• Семантика переписывания поля зрения на каждом шаге.

Синхронизирую терминологию, а то в разных диалектах Рефала она различается:
• Объектное выражение — последовательность символов и структурных (круглых) 
скобок.
• Активное выражение (рабочее выражение) — объектное выражение + скобки вызова 
функций.
• Образцовое выражение (типовое выражение) — объектное выражение + переменные.
• Результатное выражение — объектное выражение + переменные + скобки вызова 
функций. 

Рефал-библиотека для Си++ должна предоставлять шаблонный тип (в духе STL), 
представляющий объектное выражение. Шаблонный параметр представляет собой тип 
символов, символы должны иметь конструктор копирования, оператор присваивания и 
операцию сравнения на равенство. Для создания объектного выражения можно 
использовать синтаксический сахар в духе предложенного Столяровым.

Также библиотека должна предоставлять типы для активных, образцовых и 
результатных выражений. Для класса образцового выражения должна быть определена 
операция сопоставления с образцом, возвращающая подстановку переменных (тоже 
библиотечный тип). Либо итератор, возвращающий последовательность всех 
возможных подстановок. Для результатного выражения — операция подстановки 
вместо переменных их значений, возвращающая, соответственно, активное 
выражение. Для класса активного выражения должны быть определены операции 
выполнения одного шага рефал-машины и нужного количества шагов для получения 
пассивного результата — объектного выражения.

Переменные в современных реализациях Рефала (Рефал-5(λ), Рефал-6, Рефал Плюс) 
могут быть только трёх типов: переменная, принимающая выражение (e), 
переменная, принимающая терм (t) и переменная, принимающая символ (s). 
Дополнительные ограничения на переменные в этих диалектах выражаются через 
конструкции вроде условий (условия в Рефале-5(λ) и более хитрые вещи, 
основанные на неуспехах в Рефале-6 и Рефале Плюс).

Рефал-2 позволял задавать спецификаторы переменных, ограничивающие множество 
значений термов, сопоставляемых с переменными (только буквы, только скобочные 
термы, …). Рефал, описанный в «Пятикнижии Турчина» (недавно кидал ссылки, 
дублировать их не буду, чтобы не загромождать письмо), позволял переменной 
привязать произвольную функцию Рефала, проверяющую её значение. Была попытка 
написать новый диалект Рефала — D-Refal или Динамический Рефал (Марат Исламов, 
УДГУ), но она застряла на полпути. D-Refal позволял сузить тип переменной 
практически при помощи БНФ-подобной нотации + произвольным кодом на уровне 
Рефала.

К чему это экскурс? Библиотека могла бы позволять приписывать переменным 
произвольный предикат, описанный на C++! (Об этом, кстати, упоминалось у 
Столярова). В сочетании с механизмом сопоставления с образцом получился бы ещё 
более мощный pattern matching.

В общем, задача интересная. Подумаю о том, чтобы предложить её как тему для 
курсового.


Александр Коновалов

Ответить