Добрый вечер всем! Судя по тому, что на это письмо никакой реакции не воспоследовало, экосистема Рефала уже никому не интересна.
А ведь я предложил маленький шаг по борьбе с «вавилонской башней Рефала» — проблемой наличия нескольких несовместимых диалектов. Если что, темой, обозначенной в предыдущем письме, я никого не призываю заняться — я сам могу за это взяться вместе со своими студентами. Александр Коновалов 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. С уважением, Александр Коновалов