[nem-pl] Rozszerzenia - ich składnia , semantyka
Kamil Skalski
nazgul at omega.pl
Tue Oct 28 22:12:27 CET 2003
Co to rozszerzenia? Odp. http://www.nemerle.org/nemerleExtensions.html
Pierwsza próba wymyślenia składni do tego:
Mamy konstruktor [< zwykły kod >], który znaczy tyle, że jest drzewem
składniowym kodu napisanego wewnątrz. Można będzie tego używać zarówno do
pattern matchingu drzewek, jak i do ich generacji. Pytanie tylko jak tu
wprowadzić zmienne. Moja propozycja to wprowadzenie jeszcze jednego znaczka,
powiedzmy $. To teraz kilka przykładów z zamierzonym znaczeniem.
ext changeAssign (x : syntax_tree) : syntax_tree =
match x with [
| [< y <- $val; >] -> def va = val * 2;
[< y <- y + $va >]
| [< y <- a + b; >] -> [< y <- a - b + 1 >]
];
to robiłoby mniej więcej zamianę
zmienna <- 5 na zmienna <- zmiena + 10
zmienna <- wyr1 + wyr2 na zmienna <- wyr1 - wyr2 + 1 (Olszta potrafi już
takie rzeczy z exekami, a ja z będę miał to w kompilatorze ;)
wątpię, żeby powyższy przykład był sensowny pod względem możliwości
reknostrukcji typów, ale fajnie byłoby zachowanie semantyki
zwykła zmienna w [< ... >] oznacza podpięcie się do podwyrażenia (czyli
mniejszego drzewa składniowego), a zmienna poprzedzona $ podpięcie się pod
wartość - jeśli podane wyrażenie nie jest wartością o oczekiwanym typie, to
się nie zmatchuje. W generowaniu byłoby tak samo jak w matchowaniu, tyle że $
działa jakby na odwrót - ze zmiennej zwykłego typu i jakiejś wartości robi
kawałek drzewa trzymający tą wartość.
Rozszerzenia mogą być rekurencyjne i w tym kontekście są już zwykłymi
funkcjami a nie rozszerzeniami:
ext changeAssign (x : syntax_tree) : syntax_tree =
match x with [
| [< y <- a + b; other >] -> def newother = changeAssign other;
[< y <- b + a; newother >]
];
to znaczy tutaj nastąpi zwykłe wywołanie rekurencyjne, a nie wstawienie nowego
kodu w miejsce "changeAssign other"
Przydałby się operator łączenia [< ... >] z innym [< ... >], może
[< ... >] @ [< ... >]
Hmm, właśnie się zastanawiam czym się różni x od [< x >], jeśli mieliśmy
matching [< x <- y >]
Więcej hardcorowych pomysłów i przemyśleń potem.
More information about the devel-pl
mailing list