[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