[nem-pl] Drugi rysunek już ze światłocieniem
Michal Moskal
malekith at pld-linux.org
Wed Feb 25 23:36:52 CET 2004
On Wed, Feb 25, 2004 at 11:07:35PM +0100, Kamil Skalski wrote:
> Tuesday 24 of February 2004 21:27, Kamil Skalski wrote:
>
> Oto aktualny pomysł (upraszcza się na szczęście a nie odwrotnie
[...]
Ja może wyjaśnie jak ja to rozumiem, dla tych co nie śledzą dyskusji od
początku. Bo wydaje mi się, że w końcu zrozumiałem jak to ma działać (co
jest dobrym znakiem, to pewnie jest proste :-)
Więc to jest tak, że użycia i definicje identyfikatorów dostają kolory.
Dodatkowo wywołania funkcji również dostają kolory, na wypadek gdyby
były wywołaniami makr.
Identyfikatory wiążą tylko jeśli zgadza się nazwa oraz kolor.
Teraz na początku cały kod funkcji jest zielony. W momencie gdy proces
typowania zejdzie do wywołania makra -- generowany jest nowy unikalny
kolor, załóżmy, że czerwony. Ten kolor jest zapisywany w kontekście
który biega sobie wszędzie tam gdzie są quotowania. Wszystkie
nowostworzone wyrażenia są czerwone. Makro zwraca więc zasadniczo
czerwone drzewo z kawałkami pomalowanymi na zielono -- pochodzącymi z
argumentów makra.
To rozwiązuje problem higieny makr -- symbole wprowadzone przez makro
nie kolidują z symbolami wprowadzonymi na zewnątrz (bo mają różne
kolory).
Czasami chcielibyśmy wprowadzić symbol w kolorze takim jak kolor naszego
miejsca wywołania. Dlatego do w kontekście oprócz nowego unikalnego
koloru czerwonego jest też kolor zielony, jako poprzedni. W makrach
możemy użyć specjalnej funkcji by się do niego dostać i stworzyć
identyfikator w tym kolorze.
Istotne jest to, że to jest kolor wywołania -- znaczy to nie zawsze jest
kolor zielony (kolor aktualnej funkcji).
Załóżmy, że mamy makro using:
using (x = e1, e2) ==> { def x = e1; e2; x.Dispose () }
czy coś takiego. Identyfikator x jest wprowadzany z użyciem kolor piętro
wyżej.
Teraz jeśli mamy makro:
m(y) {
<[ using (x = foo(), bar(x,y)) ]>
}
i użyjemy go tak:
m(x)
to rozwija się to do:
using[cz] (x = foo[cz](), bar[cz](x[cz],x[ziel]))
co w efekcie da:
{ def x[cz] = foo(); bar(x[cz],x[ziel]); x[cz].Dispose() }
Czyli pomimo tego, że using jest niehigieniczne (w kontrolowany sposób),
to higieniczny symbol x nie wydostaje się na zewnątrz z makra m(). I o
to chodziło.
Co do symboli całkiem niehigienicznych to już wszystko jedno w zasadzie.
No, tak ja to rozumiem. I to chyba będzie działać tak jak powinno.
--
: Michal Moskal :: http://www.kernel.pl/~malekith :: GCS !tv h e>+++ b++
: When in doubt, use brute force. -- Ken Thompson :: UL++++$ C++ E--- a?
More information about the devel-pl
mailing list