Masalah praktis apa yang dihasilkan dari kurangnya makro higienis di Clojure?

11

Saya pernah mendengar bahwa makro Clojure lebih mudah untuk ditulis tetapi tidak dapat diandalkan seperti makro higienis Racket. Pertanyaan saya terdiri dari 2 bagian:

  1. Apa bedanya dengan gensymmakro higienis?
  2. Apa yang disediakan makro Racket yang tidak dimiliki Clojure? (baik itu keamanan, kompabilitas, atau apa pun)
Alex
sumber
2
Makro higienis adalah makro yang ekspansi dijamin tidak menyebabkan penangkapan pengidentifikasi secara tidak sengaja. Masalah umum penangkapan yang tidak disengaja telah dikenal luas dalam komunitas Lisp sebelum pengenalan makro higienis. Penulis makro akan menggunakan fitur bahasa yang akan menghasilkan pengidentifikasi unik (misalnya, gensim) atau menggunakan pengidentifikasi yang dikaburkan untuk menghindari masalah. Makro higienis adalah solusi terprogram untuk masalah penangkapan yang terintegrasi ke dalam makro expander itu sendiri. en.wikipedia.org/wiki/Hygienic_macro
Robert Harvey
3
Karena sistem makro higienis [Racket] memiliki pengetahuan mendalam tentang cara kerja makro Anda, makro Anda sangat terintegrasi dengan baik ke dalam lingkungan: penyorotan sintaks berfungsi dengan benar, penamaan nama variabel otomatis berfungsi dengan benar, referensi silang bekerja dengan benar, dan begitu juga semua yang lain fitur IDE [Racket] yang licin. Dengan kata lain, kebersihan tidak hanya melindungi Anda dari bug sederhana seperti penangkapan variabel — ini memungkinkan kode Anda dianalisis secara formal dengan alat yang tidak ada untuk Common LISP. randomhacks.net/2002/09/13/hygienic-macros
Robert Harvey

Jawaban:

6

Keuntungan dari makro higienis bukanlah kemampuan bahasa - Anda dapat menulis makro yang memiliki kebersihan yang baik gensymdan 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-casediperluas). 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.

Nathan Davis
sumber
2
gensymmencegah makro tidak sengaja mengacaukan pengguna makro, tetapi tidak mencegah pengguna makro dari mengacaukan makro. Sebagai contoh, pengguna makro dapat mendefinisikan ulang ifatau 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)
Phil
2
Makro yang tidak higienis tentu bermanfaat. Saya tidak yakin dengan Skema, tetapi Racket memiliki banyak operasi "pembengkokan kebersihan". Makro bahasa tersebut higienis secara default. Mereka hanya membuat Anda sangat sadar ketika Anda menghentikan kebersihan.
Phil