[nem-pl] Drugi rysunek już ze światłocieniem
Kamil Skalski
nazgul at omega.pl
Fri Feb 27 23:56:02 CET 2004
Friday 27 of February 2004 23:16, Marcin 'Qrczak' Kowalczyk wrote:
> > Wydaje mi się, że problem o którym mówisz występuje zawsze przy użyciu
> > niehigienicznej nazwy - ona nie ma podczepionego znaczenia globalnego.
>
> Chodzi o to, że niehigienicznie wstawiona nazwa będzie musiała być
> wyszukana w środowisku, w którym użyto danego makra. To środowisko już
> dawno przestało być "bieżące", bo użycie makra mogło być głęboko
> schowane w cytacie wstawionym przez inne makro i potem przekazywane
> sobie przez różne makra, więc trzeba je gdzieś przechować w drzewie
> składni.
Tak, dokładnie mamy to samo na myśli. O ile dobrze to sobie wyobrażam, to
niehigieniczna zmienna pojawi się w kodzie i "piętro wyżej" zostanie
potraktowana jako zwykła zaquotowana (hmm, nie pomyślałem o tym wcześniej,
niby to dobra rzecz, ale myślałem że niehigieniczne będą się przedostawać
wyżej). Intencja jest taka, że niehigieniczne w naturalny sposób nie łączą
się z globalnym kontekstem widocznym w miejscu definicji quotowania/makra,
tylko są "wolnymi strzelcami".
>
> Klasycznym rozwiązaniem jest doczepianie go do identyfikatorów i
> wyciąganie z nazwy makra. Być może można zamiast tego doczepiać je do
> innych wyrażeń, np. do aplikacji (które potencjalnie mogą być
> aplikacjami makr), nie jestem pewien.
No i przy takim zachowaniu jak wyżej nie ma potrzeby podczepiania kontekstu
nigdzie.
> Nie wiem, co znaczy $("m" : var). Łamanie higieny, jakie znam ze
> Scheme'a, polegałoby na tym, że m jest wyszukane w środowisku wołania
> makra używającego tego cytatu kodu zamiast w środowisku cytatu +
> środowisku samego makra. To środowisko wołania makra jest pobierane
> z nazwy makra (w Schemie jawnie - makro ma dostęp do całej swojej linii
> wywołania, tam widzi swoją nazwę, którą poza łamaniem higieny może
> ignorować; u mnie niejawnie).
$("m" : var) wprowadza niehigieniczną zmienną 'm'. Wydaje się że u nas
zachowanie będzie tak jak piszesz (patrz wyżej) jeśli chodzi o zmienne. Jeśli
chodzi o makra znające swoje wywołanie, to w tej chwili przewidujemy tylko
odzyskiwanie koloru wywołania makra (tak, to będzie trzymane gdzieś w
obiekcie aplikacji).
> Ciekawe. Wygląda na to, że dla typowych makr jest wygodniejsze - ten
> sam identyfikator wstawiony przez różne cytaty jest tym samym - za to
> w skomplikowanych makrach rozbitych na kilka pomocniczych funkcji wymaga
> ostrożności i takie pomocnicze funkcje powinny raczej używać NewSymbol
> zamiast polegania na higienie. W ogóle to powoduje, że NewSymbol jako
> funkcja staje się potrzebny, bo przy modelu kolorującym każdy cytat
> osobno wystarczyłoby <[ x ]>.
No tak, racja. Wszystko ma swoje zady i walety. ;-)
> Komunikacja przez zmienne globalne ma być ładna? :-)
> Ale może i przejdzie, zastanowię się nad tym dla swojego systemu.
>
> Ciekawe, czy można uniknąć zmiennych globalnych. Skoro kolory zależą od
> czasu rozwinięcia makra, a nie czasu użycia cytatu kodu, to może można
> by kolorować argumenty makra, a potem całe wywołanie makra, przy czym
> kolory się xorują, tzn. jeśli dany kawałek koloru już był to znika.
> To by się obyło bez zmiennych globalnych, za to jest kosztowne, jeśli
> argumenty makr są duże i makra przekazują je sobie kilka razy - być może
> wymaga leniwego kolorowania.
Tak, przeszliśmy chyba wszystkie etapy pomysłów które opisujesz (zresztą biorą
one początek w pracy Dybviga) i najfajniejszy wydaje się ten z dostępnym
stosem kolorów gdzieś publicznie. Tylko z tym xorowaniem to nie rozumiem i
nie rozumiałem już u Dybviga - u nas wszystko dostaje kolor raz i taki ma
mieć, a nie że nagle kolor znika nie wiadomo co to właściwie było.
> Sytuacja może mieć miejsce tylko jeśli cytat kodu został wygenerowany
> przez makro, a nie wpisany ręcznie. Czyli na razie tego i tak nie
> planujecie, ale zgaduję, że w przyszłości trzeba będzie sobie o tym
> przypomnieć.
Być może, ale w tej chwili nie planujemy.
To znaczy są dwie dziedziny, których nie braliśmy pod uwagę i które psują
jakoś pewnie system - używanie makr/funkcji generujących kod w runtime i
tworzenie makr/funkcji generujących kod za pomocą innych makr. To drugie jest
chyba podwójnie nie pasujące, bo wymagamy skompilowania makr przed ich
użyciem.
Kamil
More information about the devel-pl
mailing list