[nem-pl] Dalsze rozważania o higienicznych makrach
Marcin 'Qrczak' Kowalczyk
qrczak at knm.org.pl
Sun Feb 22 22:06:35 CET 2004
W liście z nie, 22-02-2004, godz. 21:25, Kamil Skalski pisze:
> >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) =...
Zupełnie nie. Po pierwsze bar było wprowadzane przez hipotetyczne makro
defrule, a nie ręcznie przez def. Po drugie było higieniczne - napisane
tylko w treści jednego makra i widoczne tylko tam.
> >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) }
Miałem na myśli higieniczne m, któremu nazwę rzeczy do zdefiniowania
podajemy przez parametr - jak zwyczajnej konstrukcji składniowej, która
coś definiuje. To m jest ograniczone do definiowania nazwy f. To tak
jakby każdy typ musiał się nazywać T.
> - 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.
To jest u niego kiepsko opisane. W rozdziale 4.3 jest ledwo wspomniane,
że zamiast "binding name" w identyfikatorze powinno być umieszczone
środowisko - ale to, jak trzeba pozmieniać algorytm, żeby używać tej
zmienionej reprezentacji identyfikatorów, trzeba zgadnąć samemu.
> 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
I właśnie trzeba to robić i dołączać środowisko do identyfikatorów
wstawionych przez makro. Chyba że w ogóle nie damy możliwości łamania
higieny, wtedy zamiast całego środowiska wystarczy przechowywać
znalezioną w nim wartość dla konkretnego identyfikatora.
> - 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
Nie widzę innego wyjścia. W momencie kompilacji quotowania w ogólności
jeszcze nie wiadomo, które nazwy z quotowania będą związane, a które
wiążące. Musiałbyś na sucho stwierdzać, które części argumentów makro
umieści w roli wyrażeń, które w formie wiązanych nazw czy wzorców, które
wyrażenia w zasięgu których nazw i wzorców itp. - nie mogąc wykonać tego
makra, bo nie znamy jeszcze jego argumentów.
--
__("< Marcin Kowalczyk
\__/ qrczak at knm.org.pl
^^ http://qrnik.knm.org.pl/~qrczak/
More information about the devel-pl
mailing list