[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