Сделать этот репозиторий фреймворком
Mazdaywik opened this issue · 3 comments
Мотивация
Рефал исходно создавался как «метаалгоритмический язык» — язык для преобразования программ на других языках:
- Турчин В. Ф. Метаязык для формального описания алгоритмических языков // В сборнике: Цифровая вычислительная техника и программирование. М.: Советское радио, 1966, с. 116–119.
- Турчин В. Ф. Метаалгоритмический язык // Кибернетика № 4, 1968, с. 116−124.
В частности, объектом преобразования программ могут быть программы на Рефале тоже. (Примером того является этот репозиторий в текущей редакции — cdf26e7.) А это значит, нужны библиотечные средства для (а) разбора программ на Рефале и (б) генерации программ на Рефале.
Одно из таких библиотечных средств есть — библиотека prefal
, разработанная Андреем Немытых:
ftp://ftp.botik.ru/pub/local/scp/refal5/bin/prefal_180216.zip
Но я (@Mazdaywik) не нахожу её удовлетворительной, поскольку (а) писал её не я 😊, (б) её интерфейс далёк от совершенства. В частности, синтаксические ошибки выводятся на stderr
(причём в нестандартном формате), само дерево не сохраняет позиции лексем исходного текста. Однако, сильной стороной библиотеки является сохранение комментариев.
Я начинал попытку сделать такой фреймворк на базе Рефала-05:
- https://github.com/Mazdaywik/Refal-05/milestone/4
- https://github.com/Mazdaywik/Refal-05/blob/858d8ab2a7a04da957f537f5947e92f908ef81d7/docs/1-intro.md#компилятор-как-набор-повторно-используемых-компонентов
- Mazdaywik/Refal-05#24
но от этой идеи отказался (Mazdaywik/Refal-05#33). Причина в том, что парсер несовместимого диалекта не нужен.
Цель
Цель — разработать на базе этого репозитория фреймворк для преобразования программ на Рефале.
Фреймворк должен включать в себя
- средства анализа (лексер, парсер),
- средства синтеза (pretty printer), он уже есть —
Plainer.ref
, - вспомогательные инструменты для преобразования программ,
- библиотеку
LibraryEx
, адаптированную к классическому Рефалу-5.
Все компоненты должны быть совместимы с Рефалом-05 — недопустимы имена, различающиеся знаками -
и _
, для каждого используемого идентификатора должна быть определена функция (обычная функция или *$ENUM
/*$EENUM
) и т.д. Условия и блоки использовать можно, поскольку (а) уже есть трансформер в базисный Рефал, (б) эти конструкции могут появиться и в Рефале-05.
Front-end должен сохранять как минимум псевдокомментарии (начинающиеся на *$
), back-end их должен печатать. Поддержка сохранения всех комментариев в парсере на начальном этапе не требуется.
Вспомогательные инструменты — это, собственно, то, что сейчас называется Transformer.ref
и функция NewName
в нём. Система эквивалентных преобразований хорошо проработана только для ограниченного Рефала — подмножества базисного подмножества, где в образцах запрещены открытые e-переменные и повторные e- и t-переменные. Поэтому при написании программ, использующих такие преобразования, нужны инструменты автоматического преобразования кода к подмножеству.
Библиотека LibraryEx
доказала (мне) своё удобство на практике, предлагается перетащить её из Рефала-05 сюда. Если путь к фреймворку будет лежать в переменной REF5RSL
(а он там должен лежать), то всегда будет удобно использовать LibraryEx
.
Задачи
Структура репозитория-фреймворка
В репозитории должны быть следующие папки: bin
, docs
, lib
, src
.
В папке lib
находится сама суть фреймворка — набор повторно используемых компонент. В ней располагаются исходники (.ref
), а после развёртывания репозитория — ещё и .rsl
’ки. Соответственно, папка lib
должна находиться в переменной окружения REF5RSL
.
В папке docs
должна находиться документация по компонентам фреймворка и сопутствующим утилитам в разметке Markdown. Очевидно, она будет отображаться как GitHub Pages.
В папке src
находятся исходники сопутствующих утилит (например, преобразователя в базисное подмножество и форматера, который состоит из парсера и плейнера, без промежуточной трансформации).
В папке bin
после развёртывания помещаются скрипты для запуска утилит — соответственно, командные файлы Windows или Bash-скрипты для POSIX.
Теперь нужна утилита вроде srmake
, которая обходит все исходники, находит в них комментарии *$FROM
и создаёт .bat
или Bash-скрипт для запуска программ.
А ещё нужно навести порядок в папке src
, реорганизовать тесты и подготовить две утилиты: перевод к базисному подмножеству и просто форматер (см. комментарий в #7).
Префикс R5FW-
Все модули, кроме LibraryEx
и Platform
, нужно переименовать, дав им префикс R5FW-
. Сейчас они имеют префикс Refal5-
. Стоит рассмотреть добавление того же префикса для entry-функций.
Мотивация
Так оно будет смотреться красивее и целостнее. Имеющийся префикс Refal5-
слишком длинный и не совсем точный — это не нативная библиотека Рефала-5 PZ, а сторонняя, а компоненты являются частью фреймворка.
Entry-функции имеет смысл переименовывать в рамках #4.