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

Marcin 'Qrczak' Kowalczyk qrczak at knm.org.pl
Mon Feb 23 22:39:05 CET 2004


W liście z pon, 23-02-2004, godz. 17:02, Lukasz Kaiser pisze:

> Poza tym, ze chcialbys zeby nie trzeba bylo pisac "NewSymbol" co chwile, co
> nie jest (chyba) az takie trudne jako prosty hack, to czy moglbys podac
> przyklad jakiegos chociaz troche sensownego makra, ktorego nie mozna napisac
> przy tym prostym systemie ktory jest teraz

Nie wiem, jaki system jest teraz, bo mowa była raczej o planowanym;
zakładam, że chodzi o system, który automatycznie kwalifikuje nazwy.

Przykładem jest pierwsze makro z "Meta-programming in Nemerle": for.
Ono działa tylko bezpośrednio w głównym programie, ale nie działa w
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)
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 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
size, z poprawną higieną byłoby size, bezpośrednio w głównym programie
byłoby dobrze przy size, a tutaj zonk - trzeba dolary i cudzysłowy.

-- 
   __("<         Marcin Kowalczyk
   \__/       qrczak at knm.org.pl
    ^^     http://qrnik.knm.org.pl/~qrczak/





More information about the devel-pl mailing list