bmstu-iu9 / refal-5-lambda

Компилятор Рефала-5λ
https://bmstu-iu9.github.io/refal-5-lambda
Other
78 stars 35 forks source link

Функция обобщённого сопоставления не считает замыкание за символ #237

Closed Mazdaywik closed 5 years ago

Mazdaywik commented 5 years ago

Функция обобщённого сопоставления не считает символами замыкания (ClosureBrackets), из-за чего, например, не встраиваются вызовы вида <Apply {{ &Func\1 … }} … >. В качестве теста:

$INLINE I;
$DRIVE D;

I { s.X = s.X }
D { s.X = s.X }

$ENTRY Go {
  e.X = <I { = e.X }> <D { = e.X }>;
}

В логе должно быть видно, что оба вызова встроились и прогнались.

Mazdaywik commented 5 years ago

Вспомнил, почему оптимизатор это не делает. Такое ограничение было заложено в качестве упрощения. А именно, следующая прогонка может привести к абсурду:

F { s.X = <Eq s.X { = s.X }> }

$DRIVE Eq;

Eq {
  s.X s.X = True;
  s.X s.Y = False;
}

Наивная реализация предложит сужение s.X → {{ & F\1 s.X }}, которое невозможно применить к образцу. Поэтому задачу беру себе, в диплом @InfiniteDisorder она не входит.

Mazdaywik commented 5 years ago

Теперь функция обобщённого сопоставления допускает присваивания вида {{ &F\1 … }} ← s.X, но не допускает сужений s.X → {{ &F\1 … }}. Последние сужения могут возникать только при наличии повторных переменных в образце. Поэтому в случае присваиваний E1 ← v, E2 ← v для разрешения требуется, чтобы E1 и E2 были либо константными символами (не конструкторами замыканий), либо s-переменными:

https://github.com/bmstu-iu9/refal-5-lambda/blob/f56bd7b3da8bfa156d9bea2f719c92651ffd0851/src/compiler/GenericMatch.ref#L311-L316