Skip to content

Commit

Permalink
Новые соображения о расширении синтаксиса (#2)
Browse files Browse the repository at this point in the history
  • Loading branch information
Mazdaywik committed Dec 12, 2020
1 parent 3a6b94e commit a0e6251
Show file tree
Hide file tree
Showing 3 changed files with 278 additions and 100 deletions.
93 changes: 92 additions & 1 deletion Documentation/Журнал/Changes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8636,4 +8636,95 @@ RUNTIME в котором функция CALL может остутствова
[TODO: Грамотная реализация библиотеки]

Написан модуль Platform::Refal-5, через него описаны платформенно-зависимые функции библиотеки
для соответствующего профиля.
для соответствующего профиля.


[12.12.2020 - 23:12:12,92]
(Версия 0.2.985)

[TOTHINK: Серьёзное расширение синтаксиса]

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

Поэтому реализовывать новый синтаксис надо по частям. Каждое новое средство, добавленное
во входной язык, упрощает и ускоряет дальнейшую разработку. Если добавить хотя бы часть новых
возможностей, это уже даст заметное повышение выразительности.

Ниже будут приведены начальные шаги реализации нового синтаксиса. Они образуют лишь подмножество
синтаксиса, описанного выше. В частности, полноценных неуспехов и действий не будет. Но предложенные
средства уже в несколько раз повысят выразительность языка. Также будут прояснены некоторые
синтаксические детали, которые выше были оставлены за кадром.

Шаги будут описаны в некотором порядке, и этот порядок не случаен.

Шаг 1. Перестройки-присваивания.
После образцового предложения может следовать ноль или более конструкций вида

"," Result "::" HardPattern

Образец должен быть жёстким выражением. Все переменные в нём новые — если в нём есть переменная
с индексом, которое ранее встречалось в предложении, считается, что перестройка объявляет новую
переменную с тем же индексом, которая сокрывает исходную в остальной части предложения. И это
поведение невозможно изменить. Если сопоставление с жёстким выражением невозможно, получаем ошибку
времени выполнения. В будущем в этом месте возможна статическая проверка форматов.
Введение перестроек уже позволит избежать написания кучи вспомогательных функций и упростит
дальнейшую разработку.

Шаг 2. Условия при простых образцах.
После образцового выражения кроме перестроек могут присутствовать условия вида

"," Result ":" Pattern

Условия и перестройки могут перемежаться между собой произвольным образом. В предложении образец
самого предложения и образцы других условий, предшествующих некоторому, должны быть «простыми».
«Простой» образец не содержит подвыражений вида e.1 … e.2, т.е. заведомо не содержит открытых
e-переменных, а также повторных e-переменных определённого вида. Вообще, достаточно запретить только
открытые переменные, но для упрощения анализа можно наложить ограничение и пожёстче.
Перестройки, в отличие от присваиваний Рефала-5λ, являются прозрачными для неуспехов, порождённых
условиями.
Запрет открытых переменных в образцах перед условиями позволяет их рассахаривать в базисный Рефал
относительно малыми усилиями (т.к. работа с открытыми переменными — вообще жесть).
Если образец условия содержит переменные с индексами, которые встречались ранее в предложении,
то они должны быть явно помечены или как повторные, или как новые. Повторные переменные помечаются
символом "@" перед переменной, новые — символом "^". Помечается только самое левое вхождение
переменной. Переменная с известным индексом без пометки является синтаксической ошибкой. Переменная
с новым индексом и с пометкой тоже является синтаксической ошибкой.
Ограничение с пометками выглядит жёстким. Если практика покажет, что оно больше ограничивает, чем
помогает, от него можно отказаться.

Шаг 3. Реализация вложенных функций.
Полная реализация подразумевает, что в компиляторе уже реализованы рантайм на Модульном Рефале
(#13) и ООП (#1). Но можно сделать неполную реализацию.
Замыкание реализуется как АДТ вида [Closure s.Func e.Context], для вызова t-переменной пишется
функция <Call …> или <Apply …>. Для профилей SimRef и C++/SR объект замыкания и саму функцию
можно поместить в mrefalrts.sref, для профиля R5 — захардкодить в линковщике (как это сделано для
инициализации и финализации).
Переменные с известными индексами в образцах внутри вложенных функций (начало предложения,
условия) оформляются точно также, как и для условий, знаками "@" и "^". Переменные с известными
индексами в присваиваниях внутри вложенных функций — тоже всегда новые.
Вложенные функции могут быть как безымянными, так и именованными. Именованные вложенные функции
здесь не представляют большой проблемы, т.к. их проверка на равенство выполняется по значению.
В Рефале-5λ замыкания сравниваются по ссылке, поэтому для именованных функций потребовались бы
циклические ссылки, что затруднит управление памятью.
Но вложенные функции пишутся не только сами по себе, они необходимы для следующего шага.

Шаг 4. «Образцовые блоки».
Добавляется синтаксис вида

"->" Callable Result

Это действие можно писать после любого результатного выражения — в перестройках, условиях
и в правой части. Таким образом, после знака "=" в правой части может быть результатное выражение
с одним или несколькими блоками. Либо просто одно результатное выражение. Знак "=" в предложении
может быть только один (исключая эти знаки во вложенных функциях).

Вложенные функции можно делать независимо от шагов 1 и 2, однако шаги 1 и 2 (особенно, 1)
упростят работу по их реализации.

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

После описанных расширений уже можно разрабатывать новый back-end и новое представление
данных в памяти, для которого можно реализовать достаточно эффективный Рефал с неуспехами.
2 changes: 1 addition & 1 deletion Documentation/Журнал/LIST.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
[TODO] Вложенные функции (ВФ)
[TODO] Ускорение работы компилятора на слабых машинах
[TOTHINK] ВПВ: Opensource-лицензия
[TOTHINK] Серьёзное расширение синтаксиса
[TODO] Грамотная реализация библиотеки
[TOTHINK] Серьёзное расширение синтаксиса
Loading

0 comments on commit a0e6251

Please sign in to comment.