Mazdaywik/refal-5-framework

Сделать этот репозиторий фреймворком

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:

но от этой идеи отказался (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.

Задачи

  • Пересмотреть интерфейсы модулей (#4).
  • Сделать исходники совместимыми с Рефалом-05 (#3).
  • Сделать Transformer.ref библиотекой.
  • Поддерживать конвертирование в ограниченный Рефал (#2).
  • Перенести сюда библиотеку 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.