Pytanie Jakie są zalety makr programu?


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  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?


21
2017-08-14 16:03


pochodzenie




Odpowiedzi:


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.


17
2017-08-14 17:08





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ę.


7
2017-08-14 20:00



"Makra schematu" to nie mniej potężne niż makra CL - to tylko dopasowanie do wzorca syntax-rules które są mniej potężne. Arbitralny syntax-case Makra stylów są tak potężne, jak makra CL, a w rzeczywistości silniejsze, ponieważ makra CL prawie ignorują informacje leksykalne. - Eli Barzilay
@ Eli Barzilay: kilka implementacji CL dostarcza informacje leksykalne za pomocą interfejsu do "środowisk" opisanych w CLtL2. - Rainer Joswig
Zauważ, że powiedziałem prawie-formalny. Jestem prawie pewien, że Oleg to pokazał syntax-rules jest Turing-complete. Moim zdaniem ograniczenia dotyczące syntax-rules i syntax-case, nawet jeśli syntax-case ma prostsze sposoby dookoła, są na miejscu, aby zapobiec subtelnym błędom w złożonych makrach (i oczywiście tworzyć publikowane artykuły). Ale uważam też, że te ograniczenia sprawiają, że proste makra są dużo mniej wygodne niż w przypadku systemu makr CL. - Nathan Shively-Sanders
Rainer: Wiem - stąd "prawie" w moim komentarzu. Generalnie uważam, że jest to o wiele mniej zdolne niż to, co otrzymujesz syntax-case makra. - Eli Barzilay
Nathan: Tak, twoja kłótnia jest niemal formalna syntax-rules, a nawet powiedziałbym, że jeśli mówimy o praktycznych zastosowaniach makr, to argument jest silniejszy. Ale Scheme robi mieć syntax-case, który może wykonywać dowolne obliczenia - nie ma potrzeby stosowania tych zawiłych hacków. - Eli Barzilay


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.


4
2017-08-31 12:02



Jednak pożądaną cechą może być zmienne wychwytywanie. Czy można to zrobić za pomocą makr Scheme? - Charles Langlois