[nem-pl] Uwagi różne

Kamil Skalski nazgul at omega.pl
Sat Feb 21 13:58:43 CET 2004


On Saturday 21 of February 2004 01:56, Marcin 'Qrczak' Kowalczyk wrote:
> w Common Lispie, bez higieny), czy to syntax-case (porządny system
> domyślnej higieny i kontrolowanego łamania higieny). Widać ludzie tego
> potrzebowali i standardowe makra im nie wystarczały.

To jest argument. Dlatego niewątpliwie rozważymy różne systemy higieniczności 
makr i ich semantyki. Jeszcze raz dzięki za wskazanie kierunków,  w których 
powinniśmy iść.

> Aha, nie słyszałem o makrach tego rodzaju, które byłyby statycznie
> typowane. Template Haskell jednak wyglądają inaczej (z tym jawnym
> zaznaczeniem, że rozwijamy makro, a nie wołamy funkcję). Chyba
> wkraczacie na terytorium, na którym nikt nie był.

No mamy nadziję, że choć kilka rzeczy jest nowych - składnia wyraźnie 
oddzielająca język od meta-języka, przezroczyste użycie makr (to może jest 
przeciwne do poprzedniego punktu, ale tak powinno być - makra powinny być 
pisane tak, żeby nie było widać że to są makra (jeśli chodzi o ich 
działanie), a potrzeba posiadania skompilowanych makr przed ich użyciem 
świetnie rozgranicza fazy kompilacji - patrz hacki (bezpośrednie pisanie co
od siebie zależy) w tej pracy o MzScheme. 
Poza tym makra ładnie operujące na OO typach, no i największy cukierek
czyli makra które typują drzewa na których operują. Proponuję zamknąć dyskusję 
o higienie, doszliśmy już chyba do dość klarownych wniosków i skupić się 
raczej na fajniejszych featurach.

> Którego nie będzie można poprawić inaczej niż rezygnując z używania
> danego makra (np. while) w rozwinięciu innego makra, tylko rozpisując
> go ręcznie. Tu nie chodzi o niespodzianki, tylko o dostępną
> funkcjonalność.

Nie, makr można u nas przecież używać w quotowaniach. Jedynie semantyka
przeciekających definicji symboli z tych makr będzie inna. Ale zaznaczam, że 
być może zdecydujemy się jednak na ten model.

> Bardzo z grubsza. Próbowałem opisać dwa listy temu, jak sobie wyobrażam

Uhum, dzięki za te i tamte wyjaśnienia oraz linki.

>
> Nie zawsze. Na przykład nie chciałbym, żeby przy napisaniu 1/x wyskoczył
> błąd kompilacji, że kompilator nie jest pewien, czy przypadkiem x nie
> będzie 0. Błąd powinien wyskakiwać w czasie kompilacji tylko jeśli
> faktycznie jest błędem, a nie tylko czymś, co może być użyte poprawnie
> bądź nie.

Miałem na myśli błędy, które są oczywiste <[ 1 + true ]> w żadnym przypadku
nie jest poprawne i powinno się wywalić podczas kompilacji makra. Tak jak 
Michał zauważył, typowania quotowań (sprawdzanie poprawności) będzie bardzo 
ograniczone, w szczególności nie powinno wołać o błędzie, że coś jest 
niejednoznaczne (w sumie po prostu obecność $ dziurawi tutaj system typów i 
to nie jest problemem, bo po prostu błąd wyjdzie w użyciu makra).

> To, że niehigiena nie przedostaje się dalej? Zależy od punktu widzenia.
> Czasem chcemy, żeby się przedostała (jeśli robimy repeat za pomocą while
> i chcemy, żeby break działał po staremu), a czasem nie (jeśli robimy
> while za pomocą lokalnej funkcji i wcale nie chcemy, żeby w ciele pętli
> znalazło się return z funkcji - załóżmy dla potrzeby przykładu, że
> funkcje niehigienicznie wprowadzają "return" tak jak w C).
>
> Jedyne zdrowe rozwiązanie tego dylematu, jakie znam, to stwierdzenie:
> niehigiena  dotyczy tylko miejsca bezpośredniego użycia makra, kropka.
> Jeśli ktoś jest taki kozak, że pisze makro rozwijające się do
> niehigienicznego makra, to sam w nim musi dodać forward nazwy:
>    def $implicit.break = break;
> i musi być świadomy, które nazwy mają przecieknąć. Nie ma możliwości
> automatycznego przeciekania wszystkiego (poza sztuczką, którą opisałem
> poprzednio, której się chyba nie poleca).

A teraz to podajesz bardzo ładne argumenty za użyciem naszego podejścia... 
Twój system nie pozwala na użycie niehigienicznego makra (prawdopodobnie 
dobrego, np. dobrze przemyślanego) w innym makrze... Nasze pozwala i jeśli 
coś ma się zepsuć, to zrobi to w ostatecznym miejscu expansji użycia.

> Czyli "macro" jest niehigienicznym makrem. Oby _N_ctx było wprowadzane
> na tych samych zasadach, co przez inne niehigieniczne makra, bo inaczej
> ludzie się pogubią.

Eeh, to jest taki hack, potem będzie coś w stylu niejawnej funkcji implicit, 
ona też jest niehigieniczna. A jakoś to należy zrobić. Poza tym można 
uhigienicznić _N_ctx, ale wtedy trzebaby dostarczyć zestawu funkcji, które 
pozwalają z niego korzystać (w sposób niejawny).





More information about the devel-pl mailing list