[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