[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