Александр, Я, пожалуй, просто вставлю сюда код :) Он не самодостаточен, но алгоритм из него читаем.
*/* * MSG-Exprs (e.Format1) e.Format2 * Return e.Format3 -- most specific generalizing of formats 1 and 2. */**MSG_Exprs* { ((*FAIL*)) *e*.Fe2 = *e*.Fe2; (*e*.Fe1) (*FAIL*) = *e*.Fe1; (*t*.Ft1 *e*.Fe1) *t*.Ft2 *e*.Fe2 \*?* */* * IF both t.Ft1 and t.Ft2 are hard terms and aren't $const'ants then * split them out with MSG-Terms. */* { *t*.Ft1 : \{ (*EVAR*); (*VVAR*); (*CONST* *e*); } \*!* *$fail*; *t*.Ft2 : \{ (*EVAR*); (*VVAR*); (*CONST* *e*); } \*!* *$fail*; <*MSG_Terms* *t*.Ft1 *t*.Ft2> <*MSG_Exprs* (*e*.Fe1) *e*.Fe2>; }; (*e*.Fe1 *t*.Ft1) *e*.Fe2 *t*.Ft2 \*?* */* * IF both t.Ft1 and t.Ft2 are hard terms and aren't $const'ants then * split them out with MSG-Terms. */* { *t*.Ft1 : \{ (*EVAR*); (*VVAR*); (*CONST* *e*); } \*!* *$fail*; *t*.Ft2 : \{ (*EVAR*); (*VVAR*); (*CONST* *e*); } \*!* *$fail*; <*MSG_Exprs* (*e*.Fe1) *e*.Fe2> <*MSG_Terms* *t*.Ft1 *t*.Ft2>; }; ((*CONST* *t*.name) *e*.Fe1) *e*.Fe2, { *e*.Fe2 : (*CONST* *t*.name) *e*.Rest = (*CONST* *t*.name) <*MSG_Exprs* (*e*.Fe1) *e*.Rest>; <*MSG_Exprs* (<*Format_Exp* <*Lookup* &*Const* *t*.name>> *e*.Fe1) *e*.Fe2>; }; (*e*.Fe1 (*CONST* *t*.name)) *e*.Fe2, { *e*.Fe2 : *e*.Rest (*CONST* *t*.name) = <*MSG_Exprs* (*e*.Fe1) *e*.Rest> (*CONST* *t*.name); <*MSG_Exprs* (*e*.Fe1 <*Format_Exp* <*Lookup* &*Const* *t*.name>>) *e*.Fe2>; }; (*e*.Fe1) (*CONST* *t*.name) *e*.Fe2 = <*MSG_Exprs* (*e*.Fe1) <*Format_Exp* <*Lookup* &*Const* *t*.name>> *e*.Fe2>; (*e*.Fe1) *e*.Fe2 (*CONST* *t*.name) = <*MSG_Exprs* (*e*.Fe1) *e*.Fe2 <*Format_Exp* <*Lookup* &*Const* *t*.name>>>; (*e*.Fe1) *e*.Fe2, { <*IsEmpty_Expr* *e*.Fe1>, <*IsEmpty_Expr* *e*.Fe2> = */*empty*/*; */* * If both e.Fe1 and e.Fe2 have non-(EVAR) terms then we can unify * them to (VVAR). Be VERY careful! We can meet &C, but it easy can be * that it points to empty expression. */* \*?* *e*.Fe1 : *e* *t*.Ft1 *e*, *t*.Ft1 : \{ (*VVAR*); (*CONST* *t*.name), # <*IsEmpty_Const* *t*.name>; } \*!* *e*.Fe2 : *e* *t*.Ft2 *e*, *t*.Ft2 : \{ (*VVAR*); (*CONST* *t*.name), # <*IsEmpty_Const* *t*.name>; } = (*VVAR*); */* * Else at least one of expressions has form of (EVAR)...(EVAR). So we * should return (EVAR). */* (*EVAR*); }; }; *MSG_Terms* { (*PAREN* *e*.Fe1) (*PAREN* *e*.Fe2) = (*PAREN* <*MSG_Exprs* (*e*.Fe1) *e*.Fe2>); *t*.Ft *t*.Ft = *t*.Ft; *s* *s* = (*SVAR*); (*SVAR*) *s* = (*SVAR*); *s* (*SVAR*) = (*SVAR*); (*SVAR*) (*SVAR*) = (*SVAR*); (*REF* *e*) *s* = (*SVAR*); *s* (*REF* *e*) = (*SVAR*); (*REF* *e*) (*SVAR*) = (*SVAR*); (*SVAR*) (*REF* *e*) = (*SVAR*); *t* *t* = (*TVAR*); }; Хотел бы просто дать ссылку на исходники, но, к сожалению, сайт с ними лежит (что с ним довольно регулярно случается, так как никто не замечает, когда он падает). Антон On Thu, Feb 21, 2019 at 12:29 AM Александр Коновалов a.v.konovalov87_AT_mail.ru <refal@botik.ru> wrote: > Доброе утро, Антон! > > *«В компиляторе (на уровне преобразования AS → AS) есть фаза порождения > возвращаемых форматов — делается наиболее тесное обобщение результатных > выражений (Most Specific Generalization — дуальная операция к Most General > Unifier — как НОК/НОД).»* > > *«Это нужно, в частности, для более качественной компиляции блоков: { > Exp1; Exp2; ... } : Pattern.»* > > Я правильно понимаю, что в выражениях Exp1, Exp2… вместо скобок активации > подставляются выходные форматы соответствующих функций, после чего > обобщению подвергаются фактически образцовые выражения? > > А где можно прочитать про алгоритм вычисления наиболее тесного обобщения? > (Можно даже ссылку на исходник, я пойму.) Просто я занимался аналогичной > задачей применительно к оптимизации сопоставления с несколькими образцами, > вот записка моего дипломника, где алгоритм описан: > > > https://github.com/bmstu-iu9/refal-5-lambda/blob/c48cf0179b66c407a5932c03cd8bf38958a8c477/doc/OptPattern/Савельев_Записка_2018.pdf > > Вот более лаконичное (но менее понятное) описание задачи в таск-трекере: > > https://github.com/bmstu-iu9/refal-5-lambda/issues/154 > > Поясню к последнему. Рассматриваются только жёсткие выражения. Образцы, > содержащие e-переменную на верхнем уровне (например, A s.1 *e**.2* t.3 (e.4) > s.3), названы образцами класса (M, N), где M и N — количество термов > до и после e-переменной соответственно, образцы, не содержащие e-переменной > на верхнем уровне (например, A s.1 (e.2 t.3) (e.4) s.3) названы образцами > класса (K), где K — длина терма. ГСО — глобальное сложнейшее обобщение, > ЛСО — локальное сложнейшее обобщение. Сложность — количество элементарных > операций отождествления. Локальное-глобальное — по аналогии с локальным > и глобальным максимумом в математике. > > > > С уважением, > Александр Коновалов > > > > > > *From:* Anton Orlov orlovan_AT_gmail.com [mailto:refal@botik.ru] > *Sent:* Thursday, February 21, 2019 1:28 AM > *To:* refal@botik.ru > *Cc:* Александр Гусев <gusev_aleksa...@mail.ru> > *Subject:* Re: Re[4]: Немного статистики > > > > > > > > On Wed, Feb 20, 2019 at 8:08 AM Arkady Klimov arkady.klimov_AT_gmail.com < > refal@botik.ru> wrote: > > Вопрос интересный, попытаюсь ответить за Антона как я планировал, если б > занялся погружением рефала-6 в ту инфраструктуру. > > Первый вариант - да, все функции имеют общий формат > > $func eX = eX; > > Затем, возможны варианты, один из которых - что-то типа псевдокомментариев. > > Интересен также вариант отображения после полусуперкомпилятора, который > форматы порождает. > > Но более продвинутая схема - проводить анализ на уровне абстрактного > синтаксиса и повышать арность автоматически, и тогда это можно было б > сделать один раз на все входные диалекты. Собственно, в этом и была задумка > - чтобы писать разные сложные анализы и преобразования уже в > диалекто-независимой > > форме. > > > > Отчасти это сделано. В компиляторе (на уровне преобразования AS -> AS) > есть фаза порождения возвращаемых форматов -- делается наиболее тесное > обобщение результатных выражений (Most Specific Generalization -- дуальная > операция к Most General Unifier -- как НОК/НОД). > > > > Это нужно, в частности, для более качественной компиляции блоков: { Exp1; > Exp2; ... } : Pattern. > > > > Запустить более продвинутый повышатель арности, который глобальнее на > программу смотрит, тоже можно было бы на этом уровне. > > > > Антон > > > > > > С уважением, > > Аркадий Климов > > > > PS. Соглашусь с Антоном, что более сложной будет задача поддержки > стандартных функций, которую предполагалось решать попросту путем написания > "переходников" на рефале. Что-то подобное было сделано в среде Рефал-6 для > поддержки входного языка Рефал-5. Конечно, эффективность будет ущербной. > > > > ср, 20 февр. 2019 г. в 12:51, Александр Коновалов > a.v.konovalov87_AT_mail.ru <refal@botik.ru>: > > Добрый день, Антон! > > *«С исполнением разных диалектов на одной платформе основная проблема — > не входной язык, а библиотека стандартных функций. Они везде разные, и все > их поддержать — довольно много возни.»* > > А проблему отсутствия форматов функций в других диалектах (Рефал-5, > Рефал-6) Вы как решили (или предполагали решать)? Считать все функции как > > $func eX = eX; > > и плевать на производительность? Или форматы задаются в псевдокомментариях? > > > > С уважением, > Александр Коновалов > > *From**:* Anton Orlov orlovan_AT_gmail.com <refal@botik.ru> > *Sent**:* Thursday, February 14, 2019 9:49 PM > *To**:* refal@botik.ru > *Cc**:* Александр Гусев <gusev_aleksa...@mail.ru> > *Subject**:* Re: Re[4]: Немного статистики > > > > > > > > On Thu, Feb 14, 2019 at 7:27 AM Arkady Klimov arkady.klimov_AT_gmail.com < > refal@botik.ru> wrote: > > Насколько я знаю, в каком-то законченно-оформленном виде такой информации > сейчас нет. > > > > Сейчас у меня появилась мысль, и хочу всем апологетам того или иного > диалекта, написать небольшой текст в свободной форме на 2-3-5 страниц с > описанием особенностей их "любимых" версий языка и их реализаций - что было > бы полезно знать потенциальным юзерам. Эти тексты (ссылки) можно было бы > разместить на сайте refal.net на страницах, связанных с каждой > версией-диалектом. В этой переписке по рефалу+ уже много информации > появилось, осталось ее собрать и оформить. Наверно, это было бы полезно. > > > > А также неплохо бы единый бенчмарк составить. И какие-то сравнительные > таблицы. > > > > А еще когда-то была установка на создание единого инструментария по > реализации разных диалектов с единым промежуточным синтаксисом AST, с > возможностью любой входной диалект на любую платформу положить. Насколько я > понимаю, рефал+ свою часть пути в основном прошел и там это представление > задокументировано. Хотел бы пройти свою часть для рефала-6, но на это > конечно нужно время. Которого, увы, нет. > > > > Кстати, AST, используемый в Р+ ( > http://wiki.botik.ru/Refaldevel/AbstractImperativeLanguage), специально в > какой-то момент правился, чтобы включить особенности Рефала-6 (но поскольку > парсер из Рефала-6 так и не был приделан, то, возможно, ещё какие-то > тонкости остались). > > > > С исполнением разных диалектов на одной платформе основная проблема -- не > входной язык, а библиотека стандартных функций. Они везде разные, и все их > поддержать -- довольно много возни. > > > > Антон > > > > > > Аркадий > > > > чт, 14 февр. 2019 г. в 09:59, Александр Гусев gusev_aleksandr_AT_mail.ru < > refal@botik.ru>: > > Спасибо, Аркадий! > > А существует где-то краткая информация по сравнению веток рефала? Статья, > может быть какая-то. > > А то есть рефал-2, рефапл-5, рефал-6 и рефал-плюс - это только те, что > поименованы. > > У каждой версии свои сторонники и блюстители. Или всё-таки придётся в > каждую вникать? > > Среда, 13 февраля 2019, 20:41 +03:00 от Arkady Klimov > arkady.klimov_AT_gmail.com <refal@botik.ru>: > > Здравствуйте, Александр! > > Прошу прощения за некоторую задержку, пришлось немного повозиться, приводя > в порядок версию дистрибуции. В принципе, есть все на сайте refal.net, но > сильно старое, с тех пор довольно много было правок. Вот та страничка: > > http://refal.net/~arklimov/refal6/index.html > > Документацию (описание языка) смотрите там, в ней ничего нового. > > А дистрибутив пока у меня в дропбоксе возьмите: > > https://www.dropbox.com/s/gh4hdcagl0swltm/ref6.zip?dl=0 > > Как и раньше, инструкция в help/readme.txt. > > Главное - распакуйте в папку ...ref6, пропишите ее в PATH и > откорректируйте путь в ri.bat соответственно. > > Затем вызовите test/hello.bat. > > В ближайшее время надеюсь переправить его на сайт, а также обновлю архивы > исходников там. > > Рефал-часть почти не изменилась с тех пор, а вот С-часть обновилась > существенно. > > Спрашивайте, не стесняйтесь, если будут проблемы. > > С уважением, > > Аркадий Климов > > > > > > > > > > > > пт, 8 февр. 2019 г. в 23:43, Александр Гусев gusev_aleksandr_AT_mail.ru < > refal@botik.ru <https://e.mail.ru/compose/?mailto=mailto%3are...@botik.ru> > >: > > Аркадий, Спасибо за ответ! > > Да, я читал переписку, не до самых глубин, конечно. > > Пока прошу актуальную ссылку на Рефал-6 - почитать и хоть что-то > попробовать, если возможно. Вроде Hello, world на трёх языках. > > То, что я имел ввиду о музыке, это тоже формульные вычисления, конечно. > > Возможно, но наверно уже на "символьном уровне", до которого еще надо > входной сигнал поднять. > > > С уважением, > Александр Гусев > gusev_aleksa...@mail.ru > <http://e.mail.ru/compose/?mailto=mailto%3agusev_aleksa...@mail.ru> > > > >