J'ai entendu dire que les macros Clojure sont plus faciles à écrire mais pas aussi fiables que les macros hygiéniques de Racket. Ma question comporte 2 parties:
- En quoi
gensym
diffèrent - elles des macros hygiéniques? - Que proposent les macros de raquette que Clojure ne propose pas? (que ce soit la sécurité, la composabilité ou quoi que ce soit)
Réponses:
L'avantage des macros hygiéniques n'est pas
gensym
lié à la capacité linguistique - vous pouvez écrire des macros qui ont une bonne hygiène en utilisant et en citant / supprimant soigneusement au bon moment. Cependant, les macros hygiéniques garantissent une bonne hygiène à vos macros. À cet égard, c'est un peu comme la vérification de type.Les macros hygiéniques peuvent également présenter des avantages d'outillage. La plupart des systèmes de macros hygiéniques imposent des contrôles stricts sur ce que fait votre macro et comment elle le fait (par exemple, vous ne pouvez pas exécuter de code arbitraire lorsqu'une macro définie par Scheme
syntax-case
est développée). Cela peut faciliter l'écriture de programmes qui «comprennent» votre macro et peut fournir un support d'outillage supplémentaire.En revanche, il existe certains cas où des macros non hygiéniques peuvent être utiles. Par exemple, si vous voulez réellement capturer une liaison pour une variable spécifique (par exemple, des macros anaphoriques ), je pense que vous n'avez pas de chance si vous ne disposez que de macros hygiéniques.
la source
gensym
empêche la macro de jouer accidentellement avec l'utilisateur de macro, mais n'empêche pas l'utilisateur de macro de jouer avec la macro. Par exemple, un utilisateur de macro peut redéfinirif
ou quelque chose comme ça. (La question "pourquoi quelqu'un ferait-il cela" est sans importance. Ceci est un exemple simple qui démontre que c'est possible, et il est difficile de raisonner sur les macros non hygiéniques)