[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