Saya pernah mendengar bahwa makro Clojure lebih mudah untuk ditulis tetapi tidak dapat diandalkan seperti makro higienis Racket. Pertanyaan saya terdiri dari 2 bagian:
- Apa bedanya dengan
gensym
makro higienis? - Apa yang disediakan makro Racket yang tidak dimiliki Clojure? (baik itu keamanan, kompabilitas, atau apa pun)
Jawaban:
Keuntungan dari makro higienis bukanlah kemampuan bahasa - Anda dapat menulis makro yang memiliki kebersihan yang baik
gensym
dan dengan cermat mengutip / tidak mengutip pada waktu yang tepat. Namun, makro higienis memastikan makro Anda memiliki kebersihan yang baik. Dalam hal itu, ini seperti pengecekan tipe.Mungkin juga ada keuntungan perkakas untuk makro higienis. Sebagian besar sistem makro higienis menerapkan kontrol ketat pada apa yang makro Anda lakukan dan bagaimana melakukannya (misalnya, Anda tidak dapat menjalankan kode arbitrer ketika makro yang ditentukan oleh Skema
syntax-case
diperluas). Ini dapat membuatnya lebih mudah untuk menulis program yang "memahami" makro Anda dan dapat memberikan dukungan alat tambahan.Di sisi lain, ada beberapa kasus di mana makro tidak higienis mungkin berguna. Misalnya, jika Anda benar - benar ingin menangkap pengikatan untuk variabel tertentu (mis., Makro anaforis ) maka saya pikir Anda kurang beruntung jika Anda hanya memiliki makro higienis.
sumber
gensym
mencegah makro tidak sengaja mengacaukan pengguna makro, tetapi tidak mencegah pengguna makro dari mengacaukan makro. Sebagai contoh, pengguna makro dapat mendefinisikan ulangif
atau sesuatu seperti itu. (Pertanyaan "mengapa ada orang yang melakukan itu" tidak relevan. Ini adalah contoh sederhana yang menunjukkan bahwa itu mungkin, dan sulit untuk menjelaskan tentang makro non-higienis)