[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