Closed Mazdaywik closed 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 она не входит.
Теперь функция обобщённого сопоставления допускает присваивания вида {{ &F\1 … }} ← s.X
, но не допускает сужений s.X → {{ &F\1 … }}
. Последние сужения могут возникать только при наличии повторных переменных в образце. Поэтому в случае присваиваний E1 ← v
, E2 ← v
для разрешения требуется, чтобы E1
и E2
были либо константными символами (не конструкторами замыканий), либо s-переменными:
Функция обобщённого сопоставления не считает символами замыкания (
ClosureBrackets
), из-за чего, например, не встраиваются вызовы вида<Apply {{ &Func\1 … }} … >
. В качестве теста:В логе должно быть видно, что оба вызова встроились и прогнались.