[nem-pl] Pierwszy szkic algorytmu higienicznego
Kamil Skalski
nazgul at omega.pl
Tue Feb 24 21:27:23 CET 2004
Po mału unifikujemy różne pomysły i problemy. Doszedłem do jakiejś pierwszej
wersji nowego algorytmu. Spróbuję go przedstawić:
1. każde makro musi przechowywać w sobie środowisko otwarte w miejscu jego
definicji (namespacey, moduł w jakim się ono znajduje)
2. przed ekspansją dowolnego makra, jego parametry zostają opakowane w
specjalną strukturę, definiującą nowy, unikalny numerek - w zamierzeniu jest
to leniwa wersja dodawania tego numerku do wszystkich identyfikatorów
występujących w tych wyrażeniach), stos numerków jest też zapamiętywany w
kontekście typowania
3. numerek z punktu 2 pozwala łatwo uzyskać środowisko z punktu 1, to znaczy
zapamiętywane jest przy którego makra ekspansji został wygenerowany numerek
4. numerki w razie potrzeby są spychane po wyrażeniu (w myśl zasady
leniwości), aż do identyfikatorów - jeśli id ma już jakiś numerek, to
zostawiany jest stary, jeśli nie ma, to jest mu przydzielany
5. napotkane w typowaniu identyfikatory są typowane z uwzględnieniem numerków,
gdy są różne, to id nawet o tej samej nazwie są różne
6. nazwy wprowadzane niehigieniczne przez $("bla" : var) są "lepkie" - to
znaczy jeśli jest użyciem zmiennej to wiąże się z najpóźniej zdefiniowanym
identyfikatorem o tej samej nazwie (ignorując swój brak numerka), jeśli jest
deklaracją, to dodawany jest na razie bez numerka i pierwsze użycie zmiennej
o tej nazwie da mu swojego (alternatywą jest przydzielenie mu numerka
aktualnej ekspansji, może to jest lepszy pomysł) - w tym punkcie można sobie
zrobić krzywdę, dlatego niezalecane jest używanie niehigienicznych makr
7. pomysł od Marcina, żeby dostępna była funkcja, która tworzy identyfikator
tak, jakby był on użyty w miejscu użycia aktualnie ekspandowanego makra -
pozwala to w kontrolowanie niehigieniczny sposób złapać zmienne użyte piętro
wyżej, w szczególności w otrzymanych parametrach dla makra
8. dostępna jest też stara dobra funkcja NewSymbol, dzięki której można sobie
używać zmiennych przenaszalnych między quotowaniami, makrami, ekspansjami
9. standardowo z makr nie wycieka żadna deklaracja, choć teoretycznie gdyby
algorytm okazał się odporny na to, to można z tego zrezygnować
Uff, teraz możemy wymyślać kontrprzykłady :)
More information about the devel-pl
mailing list