Бойко! Статья Столярова это просто первое, что мне пришло в голову по Вашему письму. Поскольку сначала я не до конца понял, что Вы имели ввиду.
Сейчас немного подумал и вот что придумал. Некоторые существенные особенности Рефала: • Объектное выражение — последовательность с правильно расставленными скобками, допускающая чтение с обоих концов и конкатенацию. Объектное выражение состоит из термов — или символов (атомов), примитивных элементов, или скобочных термов — объектных выражений, заключённых в круглые скобки. • Рефальское сопоставление с образцом. • Семантика переписывания поля зрения на каждом шаге. Синхронизирую терминологию, а то в разных диалектах Рефала она различается: • Объектное выражение — последовательность символов и структурных (круглых) скобок. • Активное выражение (рабочее выражение) — объектное выражение + скобки вызова функций. • Образцовое выражение (типовое выражение) — объектное выражение + переменные. • Результатное выражение — объектное выражение + переменные + скобки вызова функций. Рефал-библиотека для Си++ должна предоставлять шаблонный тип (в духе STL), представляющий объектное выражение. Шаблонный параметр представляет собой тип символов, символы должны иметь конструктор копирования, оператор присваивания и операцию сравнения на равенство. Для создания объектного выражения можно использовать синтаксический сахар в духе предложенного Столяровым. Также библиотека должна предоставлять типы для активных, образцовых и результатных выражений. Для класса образцового выражения должна быть определена операция сопоставления с образцом, возвращающая подстановку переменных (тоже библиотечный тип). Либо итератор, возвращающий последовательность всех возможных подстановок. Для результатного выражения — операция подстановки вместо переменных их значений, возвращающая, соответственно, активное выражение. Для класса активного выражения должны быть определены операции выполнения одного шага рефал-машины и нужного количества шагов для получения пассивного результата — объектного выражения. Переменные в современных реализациях Рефала (Рефал-5(λ), Рефал-6, Рефал Плюс) могут быть только трёх типов: переменная, принимающая выражение (e), переменная, принимающая терм (t) и переменная, принимающая символ (s). Дополнительные ограничения на переменные в этих диалектах выражаются через конструкции вроде условий (условия в Рефале-5(λ) и более хитрые вещи, основанные на неуспехах в Рефале-6 и Рефале Плюс). Рефал-2 позволял задавать спецификаторы переменных, ограничивающие множество значений термов, сопоставляемых с переменными (только буквы, только скобочные термы, …). Рефал, описанный в «Пятикнижии Турчина» (недавно кидал ссылки, дублировать их не буду, чтобы не загромождать письмо), позволял переменной привязать произвольную функцию Рефала, проверяющую её значение. Была попытка написать новый диалект Рефала — D-Refal или Динамический Рефал (Марат Исламов, УДГУ), но она застряла на полпути. D-Refal позволял сузить тип переменной практически при помощи БНФ-подобной нотации + произвольным кодом на уровне Рефала. К чему это экскурс? Библиотека могла бы позволять приписывать переменным произвольный предикат, описанный на C++! (Об этом, кстати, упоминалось у Столярова). В сочетании с механизмом сопоставления с образцом получился бы ещё более мощный pattern matching. В общем, задача интересная. Подумаю о том, чтобы предложить её как тему для курсового. Александр Коновалов
