[nem-pl] Dalsze rozważania o higienicznych makrach
Kamil Skalski
nazgul at omega.pl
Mon Feb 23 23:01:23 CET 2004
Monday 23 of February 2004 22:39, Marcin 'Qrczak' Kowalczyk wrote:
> treści innego makra. Na przykład jeśli to inne makro chciałoby rozwijać
> for_seq i <- a to b {body}
> do
> for (i <- a; i < b; i <- i + 1) {body}
> Abstrahuję od konkretnej składni, tzn. dla potrzeb przykładu może być
> for_seq(i, a, b, body)
macro for_seq (i, a, b, body)
syntax ("for_seq", i, "<-", a, "to", b, body) {
<[ for ($i <- $a; $i < $b; $i <- $i + 1) $body ]>
}
... chyba zły przykład wybrałeś, nie chce mi się tego kompilować, ale na 99%
będzie działać
> Efekt będzie taki, że wystąpienia "i" w "body" będą szukane w globalnej
> przestrzeni nazw, bo rozwijacz makra for_seq nie wie, że "for" wiąże
> "i". Zakładam, że "for" jest makrem jak w artykule, a nie jest już
> wbudowane w kompilator (i w rozwijacz makr).
Nie nie, co? tutaj żadne zmienne nie są definiowane czy łapane. Zły przykład.
>
>
> Nie działa również drugi przykład: sql_loop. To znaczy działa w głównym
> programie, ale nie działa zawarty w rozwinięciu innego makra. Nie działa
> z innego powodu: łamanie higieny idzie do głównego programu, a nie
> bezpośrednio do kodu wołającego makro. Dla uproszczenia zamiast sql_loop
> wezmę analogiczne sql_do, które obsługuje zapytania zwracające
> pojedynczy wiersz. Makro, które rozwija
> table_size(conn, "tab")
> w
> sql_do(conn, "select count(*) as size from tab") {
> size
> }
> nie zadziała w ten sposób, bo size zostanie wklejone w główne
> środowisko, a to size rozwijacz będzie próbował kwalifikować na
> podstawie widocznych tu definicji. Można to obejść i zamiast size
> napisać $("size" : var), o ile pamiętam składnię. Bez higieny byłoby
Tak, dokładnie. To jest ten samo problem, który zauważyliśmy dzisiaj z
'using'. No i jest to ten sam problem, o którym mówimy już od jakiegoś czasu.
Być może w uproszczonym (patrz wcześniejszy mail) systemie da się to trochę
łatwiej rozwiązać, niż wyciągając armatę (Dybviga) ;)
Kamil
More information about the devel-pl
mailing list