[nem-pl] Dalsze rozważania o higienicznych makrach
Kamil Skalski
nazgul at omega.pl
Sun Feb 22 21:25:50 CET 2004
> Dziedzina, w której makra zaczynają mieć duży sens, to własne
> konstrukcje wiążące nazwy i dopasowujące wzorce, bo tego się już łatwo
> funkcją nie obejmie.
Ee, dla mnie główna różnica jest taka, że makra są wykonywane podczas
kompilacji i dzięki temu mogą obliczać różne ciekawe rzeczy, a potem ich
wynik jest statycznie typowany. Makra używane do hackowania elementarnych
elementów języka, jak definiowanie zmiennych czy funkcji, to IMHO nadużycie.
Uważam słówko 'def' nie tylko zupełne pod względem wyrażalności, ale też
całkowicie wystarczające pod względem wygody. Ale sądząc po tym co ludzie
wyrabiają w Lispie i Scheme jestem w stanie uwieżyć, że można myśleć inaczej.
>> aby jego 'bar()' (Foo.A.bar () w jego intencji!) został nagle złapany przez
>> jakiś "obcy" bar wprowadzony jako definicja przez makro.
>
>Ależ chciałby - w końcu po to wstawił definicję bar, żeby w jej zakresie
>bar oznaczał zdefiniowaną rzecz. Nie musi nawet pamiętać, które
>konstrukcje definicyjne są wbudowane, a które są makrami.
Gdyby naprawdę tego chciał i był rozsądnym programistą, to napisałby
def $("bar" : var) =...
umieszczając przy tym komentarz, że TO 'bar' nadejdzie z TEGO 'm()', a nie z
Foo.A
> no i można wyrazić w nim wszystko co w tamtym
>
>Nieprawda, nie da się zrobić makra wprowadzającego definicję, które jest
>używalne nie tylko w głównym programie, ale i w rozwinięciach innych
>makr.
Da się:
macro m() { <[ def $("f" : var) = ... ]> }
macro m'() { <[ m(); $("f" : var) }
>Nie nadal, tylko właśnie zaczyna być niehigieniczne. Nie pozwalasz
>zapisać higienicznego użycia makra, naturalny zapis nie jest nawet
>interpretowany niehigienicznie, tylko po prostu nie działa i trzeba
>wymyślać jakieś obejścia.
Higieniczna wersja powyższego:
mutable f : string;
macro m() { f <- NewSymbol (); <[ def $(f : var) = ... ]> }
macro m'() { <[ m (); $(f : var) }
I poraz kolejny zaznaczam, że to co dla Ciebie jest naturalne, jakimś trafem
dla mnie nie jest... nic na to nie poradzę :)
A teraz kilka uwag konstruktywnych:
- przeczytałem algorytm z pracy Dybviga i poza tym, dlaczego to napewno działa
wydaje się z miarę do strawienia. Nie rozumiem natomiast tego co piszesz o
swoich pomysłach na jego zmienienie... niestety zupełnie nie mam intuicji co
możnaby tu opuścić i dlaczego. Jego propozycja z "ostatnio związanym
symbolem" i "oznaczeniami, a raczej zbiorem kolorów" wydaje się całkiem
naturalna
- implementacyjnie to może zabić, zarówno szybkość, poprawność ;) i
zrozumiałość kodu to robiącego
- nie wyobrażam sobie jak w tym systemie zrobić rozwijanie namespaców, u niego
nigdzie nie ma przechowywania kontekstu w którym makro zostało napisane.
Potrzebujemy tego, żeby stwierdzić, że niezłapana zmienna odnosi się do
symbolu z namespaceu otwartego w miejscu napisania makra - do tego
musilibyśmy z każdym makrem utożsamiać całe środowisko widoczne w miejscu
jego definicji
- przerzucenie rozwiązywania nazw z kompilacji quotowań do ich (makr w których
się znajdują) użycia to strata zarówno na szybkości, jak i klarowności
komunikatów błędów (to że zrąbałeś jakieś nazwy w quotowaniu w makrze okazuje
się dopiero w użyciu makra) - są to jednak rzeczy do przejścia, szybkość
można polepszać, a komunikaty generalnie chyba będą przetrawialne no i będzie
wiadomo które makro I CO zepsuło
Zatem nawiększy problem widzę w rozwijaniu, no i w implementacji, która na
pewno będzie działać, bo ta tematyka jest dość trudna.
Kamil
More information about the devel-pl
mailing list