[nem-pl] Uwagi różne
Kamil Skalski
nazgul at omega.pl
Sat Feb 21 13:26:06 CET 2004
On Saturday 21 of February 2004 00:33, Marcin 'Qrczak' Kowalczyk wrote:
> definicji i ogólnie wiązań, nadają się tylko do wyrażeń składających się
> z podwyrażeń - żadnych wzorców w podwyrażeniach, chyba że wewnątrz
> wbudowanych, znanych rozwijaczowi konstrukcji.
Przyznasz, że jest to dość zaawansowane zastosowanie makr. W tej chwili
używamy tylko dość prymitywnych makr, są użyteczne i (jako autorzy makr)
jesteśmy chyba dalego od granicy ich możliwości. :)
> To, że rozwijacz makr tego nie widzi, nie jest usprawiedliwieniem.
> Po to zrobiłem makro defrule, żeby mieć nową składnię definicji,
> równie prawdziwą jak te wbudowane, o takich samych prawach.
>
> > Czyli nawet jeśli defrule wygeneruje 'def bar =' to prawidłowym
> > zachowaniem jest związanie 'bar()' z Foo.A.bar. Jeśli ktoś chce inaczej,
> > to to jest niehigieniczność i powinien sobie z tym poradzić robiąc z
> > 'bar' jakiś NewSymbol ().
>
> Nic podobnego. Potraktowanie defrule jako definicji wiążącej argument
> bar jest prawidłowe, higieniczne i wskazane. A to, że tego nie da się
> stwierdzić już w momencie wstawiania rozwinięcia makra to kodu, to
> przykra rzeczywistość - przeszkoda wysoka, ale do pokonania. Scheme
> sobie z tym radzi, Dylan też, mój język też sobie będzie radził.
Masz rację, przynajmniej w jakimś świecie, bo każdy może chcieć coś innego.
Jestem pewien że długo utrzymywałbym argumentację, że programista nie chciałby
aby jego 'bar()' (Foo.A.bar () w jego intencji!) został nagle złapany przez
jakiś "obcy" bar wprowadzony jako definicja przez makro. Jest tu pewien
konflikt w interpretacji zasady lexical scoping. Mam lekkie wrażenie, że Ty,
Dylan i innie przekombinowaliście trochę, utrudniając sobie żecie, ale to
tylko moja własna opinia.
>
> > Nie wiem, może w ten sposób ograniczamy się mocno, ale naprawdę zdziwię
> > się, jeśli zobaczę program, w którym ta sterylność, bo to już nie jest
> > tylko higieniczność, jest przydatna.
>
> To jest najnormalniejsza higiena połączona z możliwością definiowania
> makr-definicji, oraz z możliwością definiowania makr-wyrażeń używających
> w środku wzorców (tzn. np. takich jak match i try). Przed rozwinięciem
> makra nie rozpoznasz, które fragmenty jego argumentów staną się
> wzorcami, więc nie wiesz, które nazwy są użyte, a które wiążące,
> a z tych użytych - czy nie trafią przypadkiem w zakres jakiegoś
> wiążącego, pochodzącego z innego parametru tego makra.
To że uważasz to za normalne, nie jest dostatecznym argumentem. Chodzi mi o
przykład, który w systemie sterylnych makr jest łatwiej / jaśniej zrobić niż
w prostym systemie.
> Ale bardzo ograniczony. To już lepiej darować sobie higienę - będzie
> można robić jak w Common Lispie, ręcznie gensymy i kwalifikowany nazwy -
> niż w ogóle uniemożliwić robienia makr używających wzorców i definicji.
Nie zgadzam się. Proste podejście jest bardzo spójne (śmiem nawet sądzić że
bardziej niż sterylne) no i można wyrazić w nim wszystko co w tamtym - jeśli
coś jest nie takie jak uważasz, to używaj $(..) + NewSymbol, co nawiasem
mówiąc jest nadal higieniczne.
More information about the devel-pl
mailing list