[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