Quel problème pratique résulte du manque de macros hygiéniques à Clojure?

11

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:

  1. En quoi gensymdiffèrent - elles des macros hygiéniques?
  2. Que proposent les macros de raquette que Clojure ne propose pas? (que ce soit la sécurité, la composabilité ou quoi que ce soit)
Alex
la source
2
Les macros hygiéniques sont des macros dont l'expansion est garantie de ne pas provoquer la capture accidentelle d'identifiants. Le problème général de la capture accidentelle était bien connu au sein de la communauté Lisp avant l'introduction des macros hygiéniques. Les macro-rédacteurs utiliseraient des fonctionnalités linguistiques qui généreraient des identifiants uniques (par exemple, gensym) ou utiliseraient des identifiants obscurcis afin d'éviter le problème. Les macros hygiéniques sont une solution programmatique au problème de capture qui est intégrée à l'expandeur de macro lui-même. en.wikipedia.org/wiki/Hygienic_macro
Robert Harvey
3
Étant donné que le système de macro hygiénique de [Racket] a une connaissance approfondie du fonctionnement de votre macro, votre macro est extrêmement bien intégrée dans l'environnement: la mise en surbrillance de la syntaxe fonctionne correctement, le changement de nom automatique des variables fonctionne correctement, les références croisées fonctionnent correctement, ainsi que toutes les autres Slick [Racket] IDE features. En d'autres termes, l'hygiène ne vous protège pas seulement contre de simples bogues tels que la capture de variables, elle permet à votre code d'être analysé formellement par des outils qui ne pouvaient tout simplement pas exister pour Common LISP. randomhacks.net/2002/09/13/hygienic-macros
Robert Harvey

Réponses:

6

L'avantage des macros hygiéniques n'est pas gensymlié à 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-caseest 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.

Nathan Davis
la source
2
gensymempê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éfinir ifou 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)
Phil
2
Les macros non hygiéniques sont certainement utiles. Je ne suis pas sûr de Scheme, mais Racket a beaucoup d'opérations de "flexion hygiénique". Les macros de la langue sont hygiéniques par défaut. Ils vous rendent très conscients lorsque vous ne respectez pas l'hygiène.
Phil