Dlaczego ktokolwiek wolałby makra Scheme nad makrami Common Lisp (a ja naprawdę chcę też wiedzieć, nie próbuję być trollem)?
Moje doświadczenie jako Lisp newb polega na tym, że makra w stylu Common Lisp są łatwiejsze do nauczenia niż makra Scheme. Nie widziałem jeszcze żadnych zalet makr Scheme, ale oczywiście to nie znaczy, że nie istnieją.
Wiem, że makra Scheme są "higieniczne", ale nadal nie jestem przekonany, że jest to warte dodatkowej złożoności. Z drugiej strony oczywiście są osoby, które są przekonane, że jest to konieczne, w przeciwnym razie nie byłoby implementacji makr Scheme w Common Lisp.
Aby krótko opowiedzieć, czy ktoś może bronić makr Scheme?
Schematy makr wprowadzają dwie, zasadniczo ortogonalne koncepcje: higiena i dopasowywanie wzorców. Higiena jest mniej ważna w lisp2 jak Common Lisp. Język dopasowujący wzorce przechwytuje wiele typowych makrologii makroekonomicznych, ale ma problem z tym, że zasadniczo jest innym językiem niż schemat. Prawdopodobnie najlepszym wprowadzeniem do makr schematu, wraz z niektórymi przesłankami za nimi jest Shriram Krishnamurthi's PLAI rozdziały 36 i 37.
Podejrzewam, że powodem, dla którego ludzie piszą systemy makro w typowym seplenieniu, jest raczej dopasowanie wzoru niż higieny.
Ponieważ używają oni innego języka niż Scheme, makra Scheme są mniej wydajne niż makra Common Lisp w prawie-formalnym sensie: ty mogą wykonuj arbitralne obliczenia w czasie kompilacji, ale są owłosione i zawiłe. To bardzo przypomina argument za nieużywaniem set!
: mniej silny set!
wolne języki produkują mniej błędny kod w zamian za niezręczne obchodzenie się z państwem. Za każdym razem, gdy wymienisz siłę na dyscyplinę, obstawiasz, że na dłuższą metę będziesz w stanie budować bardziej złożone systemy.
To najlepszy argument, jaki widziałem w makrach Scheme nad Common Lisp: jeśli budujesz skomplikowany język na Schemacie, mniej prawdopodobne jest wprowadzanie subtelnych błędów makro, jeśli będziesz trzymać się standardowego systemu makr.
Osobiście nie buduję dużych języków za pomocą makr, więc wolę makra Common Lisp. Uważam, że są one o wiele łatwiejsze w przypadku małych zleceń i unikania zmiennego wychwytywania itp. Nie jest to wielka sprawa na małą skalę.
Schematy makr zachowaj przejrzystość referencyjna.
Cytowanie "Podręcznika Guile" 6.10.2.2 Higiena:
Makra składni-reguły (..) zachowują przejrzystość referencyjną. Kiedy ty
odczytać definicję makra, wszystkie wolne wiązania w tym makrze zostaną rozwiązane
względem definicji makro; i kiedy czytasz makro
tworzenie instancji, wszystkie wolne wiązania w tym wyrażeniu są rozwiązywane
względem wyrażenia.
Ta właściwość jest czasami określana jako higiena i pomaga w kodzie
czystość. W swoich definicjach makr możesz swobodnie się przedstawić
zmienne tymczasowe, bez obawy o nieumyślne wprowadzenie
powiązania z rozszerzeniem makr.
Oferty standardowe syntax-rules
i syntax-case
.