[nem-pl] Dalsze rozważania o higienicznych makrach

Kamil Skalski nazgul at omega.pl
Sun Feb 22 22:35:04 CET 2004


Sunday 22 of February 2004 22:06, Marcin 'Qrczak' Kowalczyk wrote:
> > 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.

Drugi przykład był higieniczny, a jak chcesz higieniczny i parametryzowalny to 
proszę:
macro m(id : string) { <[ def $(id : var) = ... ]> }
macro m'() { def x = NewSymbol (); <[ m ($(x : string)); $(x : var) ]> }

> 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.

:-)

> 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.

Hmm, dlaczego do indentyfikatorów? Nie wystarczyłoby tak tweakować kontekstu 
typowania, żeby do wyniku ekspansji makra stosowało odpowiednie środowisko - 
przecież wszystkie zmienne wprowadzane przez to makro będą miały to samo... 
zresztą do tego służą chyba te 'mark', żeby znaczyc zmienne wprowadzone przez 
to makro i nie związane z niczym zdefiniowanym przez to samo makro.

No ale ja to jeszcze za słabo sobie wyobrażam, może to każda zmienna musi 
dostawać to środowisko, które zresztą byłoby gdzieś sobie trzymane osobno.

> 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.

Hehe, w szczególności masz chyba na myśli coś takiego:
macro m(id) { match (id) { 
                     | <[ $(name : var) ]> => <[ def $(name : var) = ... ]> 
                   }
}
macro m'() { <[ m(x); x ]> }
tutaj to z 'x' dzieją się naprawdę ciekawe rzeczy po ekspansji m(..)

No generalnie rozumiem już w pełni jak to powinno wg ciebie się zachowywać, 
choć oczywiscie da się to zachowanie uzyskać nieco większym wysiłkiem 
ręcznie. Pytanie jest nadal czy na pewno tak chcemy... choć prawdę mówiąc 
poza powodami natury implementacyjnej i wydajnościowej nie widzę dużych 
przeciwwskazań.

Natomiast co do tego jak to zrobić, to nadal nie jestem pewien - mam dziwne 
wrażenie, że to co jest opisane w pracy odnosi się do nieco innych założeń, 
no i jest kupa rzeczy do domyślenia.

Zobaczymy... ale wydaje mi się, że najpierw zrobimy nasz statyczny, prosty 
system.





More information about the devel-pl mailing list