-
Couldn't load subscription status.
- Fork 39
Description
Ранее в рамках этой задачи предлагалось ещё и удалять экранированные предложения на стадии оптимизации. Эта деятельность была перенесена в отдельную задачу #346, которая не связана с текущей. Постановка текущей задачи отредактирована.
Введение
В компиляторе уже присутствует механизм распознавания экранируемых предложений — компилятор выдаёт предупреждения (при включённой опции -Wscreening) на случаи, когда предложение экранируется одним из предшествующих.
Модуль был реализован Александром Барлукой aka @nexterot (#256, #297) под руководством Антонины Николаевны Непейвода aka @TonitaN (теоретический фундамент) и меня (архитектура компилятора).
Мотивация
Групповым экранированием предложений называется ситуация, когда некоторое предложение не выполняется из-за того, что предшествующие предложения в совокупности покрывают то же или большее множество возможных значений, что и само это предложение. Простой пример:
F {
t.1 t.2 e.3 = One;
e.X t.Y = Two;
/* пусто */ = Three;
e.X = "Boom!";
}
Последнее предложение никогда не выполнится, т.к. предшествующие в совокупности его экранируют. Однако, ни одно из предшествующих само по себе не экранирует последнее.
Групповое экранирование в компиляторе уже возникает и возникает давно. Вот есть функция Map, которая является специализируемой:
refal-5-lambda/src/lib/common/LibraryEx.refi
Lines 21 to 32 in db0ccf9
| /** | |
| <Map t.Closure t.Item*> == e.ItemRes* | |
| <Apply t.Closure t.Item> == e.ItemRes | |
| */ | |
| Map { | |
| t.Fn t.Next e.Tail = <Apply t.Fn t.Next> <Map t.Fn e.Tail>; | |
| t.Fn /* пусто */ = /* пусто */; | |
| } | |
| $SPEC Map t.FUNC e.items; |
С аварийным предложением функция примет вид
Map {
t.Fn t.Next e.Tail = <Apply t.Fn t.Next> <Map t.Fn e.Tail>;
t.Fn /* пусто */ = /* пусто */;
t.FUNC e.items = <Map@0 t.FUNC e.items>;
}
Аварийное предложение здесь избыточно, поскольку оно экранируется предшествующими предложениями.
Реализация
При реализации нужно решить ряд следующих задач:
- Проконсультироваться с Антониной Николаевной @TonitaN относительно алгоритма группового экранирования. Она спец в этих алгоритмах (это тема её научной работы), я — полный ноль.
- Реализовать групповое экранирование в распознавателе экранирования.