[nem-pl] Dalej o składni rozszerzeń

Kamil Skalski nazgul at omega.pl
Mon Nov 3 16:13:36 CET 2003


Hej!

Na początek proponuję zmianę [< >] na <[ ]>, bo ładniej i czytelniej wygląda 
(a i tak jest tymczasowe, może wymyślimy coś lepszego).

> Propozycja jest taka, zeby zmienic gramatyke w taki sposob, zeby mozna
> bylo we wzorcach pisac nie tylko to co jest, ale tez
> [<[typ]: kod >], tzn. do jakiejs reguly (jakiejs, bo nie znam aktualnej
> wersji) pattern := .... doszloby

Taki sposób określania typu trzyma się kupy. Ale rzeczywiście będzie pewnie 
potrzebnych kilka kolejnych typów, chyba że np. definicje funkcji, klasy 
podpiąć pod wyrazenie.

> Jesli chodzi o branchedX to reguly bylyby identyczne jak w zwyklej
> gramatyce, tylko dodatkowo doszloby wyrazenie $(expr: Expr) (lub tez
> jakies inne) dajace mozliwosc wklejania zwyklych wyrazen Nemerle.

Nie rozumiem co chcesz z tym $ robić. Ja myślałem o nim jako metodzie 
wyłuskania informacji z atomowych wyrażeń/typów. Można np. napisać
<[ x $(name, type) <- val ]>
albo może nawet wprowadzić konstruktory do środka
<[ x $(Var(name), type) <- val $(Const(value), type) ]>
gdzie
x - matchuje się do poddrzewa, w tym wypadku zawierającego zmienną
name - do nazwy zmiennej
type - do drzewa typu
value - do wartosci (o ile 'val' nie jest wyrazeniem ani zmienna) o typie 
'type'. Problem jeśli ten typ to coś skomplikowanego, zdefiniowanego gdzie 
indziej... to wymagałoby znajomości tej definicji i otypowania wyrażenia, 
chyba żeby te typy tutaj traktować jak w języku skryptowym tudzież w Prologu, 
to znaczy jako parę t = 'nazwa konstruktora' * list t.

> Nie ma głównej trudności. Po prostu trzeba dopisać odpowiednie reguły.
> I nie spowodować konflików s/r.

Oczywiście to moje zadanie i zajmę się nim, kiedy już wymyślimy w miarę 
dokładnie składnię tego wszystkiego.

> Mysle, ze tak by bylo najlepiej. Type jest potrzebny zeby moc wchodzic do
> klas, nie wiem co jeszcze, bo jak to bedzie wywolywane rekurencyjnie na

No i właśnie tutaj napotkałem na kilka wątpliwości:
wywołania rekurencyjne oczywiście chcemy, są dwie propozycje
-  ext f (a : syntax_tree ) : syntax_tree =
    match a with [
      | <[ x <- y + z ]> -> <[ x <- $f(y) - $f(z) ]>
      ...
     lub inna wersja takiego zmieszania metajęzyka z językiem
-  ext f (a : syntax_tree ) : syntax_tree =
    match a with [
      | <[ x <- y + z ]> -> def (ny, nz) = (f y, f z);
                                    <[ x <- ny - nz ]>
    
Druga oczywiście ładniej wygląda i w ogóle jest przejrzysta, ale jest 
przydługawa i nieco uciążliwa.

Kolejna sprawa to matchowanie list wyrażeń/typów. 
<[ class x { contents } ]> -> ... tutaj 'contents' zmatchuje się z listą 
pól/metod. Pytanie czy dopuszczamy konstrukcję bezpośretnio operujace w 
środku:
<[ class x { var1 : string; contentsrest } ]> -> ... niby bez sensu bo i tak 
musimy tą resztę przerobić osobno, ale kto wie.

No i potem te listy będzie się składać z powrotem
<[ var1: int ]> :: rest -> <[ var1 : float ]> :: (f rest)
lub
... -> def ncontents = g contents;
        <[ class x { costam; costam1; ncontents } ]>

W sumie myślę, że oba sposoby są dobre i nie kłócą się, więc niech zostaną, a 
w razie czego to komentujcie.

> wiekszych czesciach kodu to cos jeszcze moze byc potrzebne. Moze tydecl,
> zeby tworzyc typy gdy sa potrzebne (chociaz raczej tak nie bedzie) ?

Chyba nie będą potrzebne, jeśli zrobimy tak jak pisałem, żeby typy były 
jakimiś stringami czy coś w tym stylu.

Chciałbym zauważyć, że dla mnie parsowanie tych rozszerzeń wcala nie jest 
jeszcze proste. Nie ma ustalonej składni/semantyki $. Nie wiem jakiej postaci 
będą funkcje i pola obiektów:
<[ class _ { $(Var(name), type) }
czy może
<[ class _ { $(Field(name)) : type }
i
<[ class _ { 'a $(Fun(name)) (params) : type } - tu szczególnie wątpliwa jest 
zmienna typowa, bo ona wpływa mocno na parametry... a my byśmy tu rozwalili 
to połączenie.

Następnym razem przejrzę całą składnie języka i spróbuję określić jakąś spójną 
składnie do jej rozbioru. Napiszcie jednak co myślicie dokładnie o $ i jak 
głęboko on powinien się wgłabiać.

Kamil




More information about the devel-pl mailing list