Добрый вечер всем!

Судя по тому, что на это письмо никакой реакции не воспоследовало, экосистема 
Рефала уже никому не интересна.

А ведь я предложил маленький шаг по борьбе с «вавилонской башней Рефала» — 
проблемой наличия нескольких несовместимых диалектов. Если что, темой, 
обозначенной в предыдущем письме, я никого не призываю заняться — я сам могу за 
это взяться вместе со своими студентами.

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

 

From: Александр Коновалов [mailto:a.v.konovalo...@mail.ru] 
Sent: Saturday, January 27, 2018 3:22 PM
To: refal@botik.ru
Subject: Общее подмножество Рефала-5 и Рефала-6

 

Добрый день всем!

В одном из своих предыдущих писем я затронул вопрос общего подмножества 
Рефала-5 и Рефала-6. Сейчас раскрою этот вопрос подробнее.

На сколько мне известно, Рефал-6 изначально писался как альтернативная 
реализация Рефала-5 Турчина, и, по-видимому, был совместим с ним на уровне 
исходного кода. Позже развитие обоих диалектов разошлось. В августе 2000-го 
Рефал-5 обзавёлся новым синтаксисом: идентификаторы, в частности, стали 
чувствительными к регистру, появились escape-последовательности, были запрещены 
переменные без точки, а также изменился формат функции Type. Рефал-6 обзавёлся 
синтаксисом и семантикой действий и неуспехов из Рефала Плюс много раньше 
2000-го года, тут я уже не в курсе. И в итоге сейчас практически любая 
программа для Рефала-5 не будет компилироваться Рефалом-6 и наоборот.

Однако, можно выделить подмножество программ, которые будут успешно 
компилироваться и одинаково выполняться актуальными (доступными на 2018-01-27 в 
интернете) реализациями Рефала-5 (PZ Oct 29 2004) и Рефала-6 («Обновлено 
08.02.2001»). Если программа на Рефале-5 удовлетворяет следующим требованиям:

*         После каждой «}» обязательно ставится «;».

*         Имена функций и идентификаторов (без кавычек) всегда начинаются с 
большой буквы.

*         Используются только escape-последовательности \n, \r, \t, \', \", \\, 
\xHH (только в 'литерах' и "составных символах").

*         Не используются никакие встроенные функции кроме коротких синонимов 
для арифметики: <+…>, <−…>, <*…>, </…>, <%…>, при этом после + и − обязателен 
пробел.

*         Результаты арифметических вычислений не должны быть отрицательными и 
не должны превышать 2³²−1.

*         Стартовая функция всегда пишется как GO.

То в этом случае программа может быть успешно откомпилирована и выполнена 
Рефалом-6 ключами по умолчанию (компилируется при помощи rfc program.ref, 
выполняется при помощи ri i+program+*GO).

Поясню некоторые пункты списка.

Синтаксис функций Рефала-5 имеет вид «[$ENTRY] Имя Блок», синтаксис функций 
Рефала-6 — «[$ENTRY] Имя ОбразцовоеОкончание», причём «ОбразцовоеОкончание» 
должно завершаться точкой с запятой. Однако, синтаксис Рефала-5 допускает на 
верхнем уровне грамматики использовать незначащие точки с запятой.

Рефал-5 допускает имена, начинающиеся с маленькой буквы, Рефал-6 не допускает. 
Поэтому запись «eq» первый воспримет как имя, второй — как переменную.

Рефал-5 также допускает escape-последовательности «\<», «\>», «\(», «\)» 
которые обозначают те же символы, что и без «\». При этом текущая реализация 
refc допускает запись escape-последовательностей вне кавычек — это 
альтернативная запись для литер: \n эквивалентно '\n'. Это нигде не 
документированная возможность, но она есть (и поддерживается Рефалом-5λ, 
кстати). Другие escape-последовательности, кроме вышеперечисленных и 
недокументированных, Рефал-5 не поддерживает.

Встроенные функции текущей реализации Рефала-5 начинаются с прописной буквы и 
пишутся строчными: Open, Add и т.д. Встроенные функции Рефала-6 пишутся целиком 
прописными буквами: OPEN, ADD. Соответственно, их множество пересекается только 
на коротких синонимах. Нюанс со знаками «+» и «−» объясняется тем, что слитная 
запись знака с целым числом описывает отрицательное число, т.е. <−10 5> в 
Рефале-5 будет проинтерпретировано вычитание из десяти пяти, в Рефале-6 как 
вызов числа «минус десять» в роли функции с аргументом «пять». Можно 
переопределить функцию APPLY_OBJECT, чтобы и это работало, но я пока не касаюсь 
переопределения библиотеки. 

Длинная арифметика в Рефале-5 описывается цепочками макроцифр, причём признак 
отрицательного числа обозначается литерой '−'. В Рефале-6 сами символы-числа 
являются числами произвольной разрядности со знаком. Поэтому отрицательные или 
слишком большие результаты арифметических операций будут выглядеть по-разному.

Последний пункт про GO — мне не удалось запустить программу (с ключами запуска 
по умолчанию), стартовой функцией которой является функция Go.

Но, у Рефала-6 есть слой совместимости с Рефалом-5, который позволяет расширить 
общее подмножество. Именно расширить, поскольку слой устарел + синтаксические 
различия. Во-первых, это стартовый модуль i5.rex, содержащий определения 
некоторых встроенных Рефала-5. Во-вторых, чтобы можно было воспользоваться 
r5.rex без его модификации, компилировать программу следует с ключом /U — все 
незакавыченные слова в upper case. В этом случае программа на Рефале-5 должна 
ограничиваться следующими требованиями:

*         Опять после «}» обязательно должна быть «;».

*         Имена функций и идентификаторов пишутся с большой буквы. Нельзя в 
программе использовать функции и идентификаторы, которые различаются только 
регистром символов. Не следует предполагать, что AbCd == "AbCd".

*         Escape-последовательности см. выше.

*         Можно использовать встроенные функции с номерами от 1 «Mu» до 35 
«Sysfun». Номера функций можно посмотреть в выводе функции «ListOfBuiltin» (но 
она имеет номер 67). Короткими синонимами для арифметики пользоваться нельзя.

*         Не следует делать никаких предположений о размере макроцифры. В 
Рефале-5 отрицательные числа записываются как '−' s.1 s.2 s.3…, положительные — 
как '+' s.1 s.2 s.3… или s.1 s.2 s.3…; в Рефале-6 — '−' s.One, '+' s.One или 
s.One соответственно.

*         Запрещено пользоваться функцией Type, ибо форматы возвращаемого 
значения в обоих реализациях различны.

*         Функция Step может показывать разные значения на обоих реализациях. В 
Рефале-6 библиотечные функции написаны на Рефале и поэтому они могут 
выполняться за несколько шагов рефал-машины, в отличие от Рефала-5.

*         Стартовую функцию можно называть Go или GO.

Чтобы ещё больше расширить подмножество, можно в первую очередь обновить 
библиотеку совместимости — добавить синонимы функций с именами в правильном 
регистре, обновить функцию Type и (что потребует расширения интерпретатора) 
добавить новые встроенные функции. С точки зрения синтаксиса можно поступить 
по-разному: от разрешения не писать «;», когда тело функции задаётся одним 
блоком (это не должно привести к противоречиям в грамматике) до разработки 
отдельного front-end’а для синтаксиса Рефала-5. Но даже разрешение отсутствия 
точек с запятой на верхнем уровне вместе с модификацией библиотеки сделает 
Рефал-6 точным надмножеством Рефала-5.

С уважением,
Александр Коновалов 

Ответить