Welches praktische Problem ergibt sich aus dem Mangel an Hygienemakros in Clojure?

11

Ich habe gehört, dass Clojure-Makros einfacher zu schreiben sind, aber nicht so zuverlässig wie die Hygienemakros von Racket. Meine Frage besteht aus 2 Teilen:

  1. Wie unterscheidet gensymsich von Hygienemakros?
  2. Was bieten Racket-Makros, was Clojure nicht bietet? (sei es Sicherheit, Zusammensetzbarkeit oder irgendetwas)
Alex
quelle
2
Hygienemakros sind Makros, deren Erweiterung garantiert nicht dazu führt, dass Identifikatoren versehentlich erfasst werden. Das allgemeine Problem der versehentlichen Erfassung war in der Lisp-Community vor der Einführung von Hygienemakros bekannt. Makroschreiber würden Sprachfunktionen verwenden, die eindeutige Bezeichner (z. B. Gensym) erzeugen, oder verschleierte Bezeichner verwenden, um das Problem zu vermeiden. Hygienemakros sind eine programmatische Lösung für das Erfassungsproblem, das in den Makroexpander selbst integriert ist. en.wikipedia.org/wiki/Hygienic_macro
Robert Harvey
3
Da das hygienische Makrosystem von [Racket] genau weiß, wie Ihr Makro funktioniert, ist Ihr Makro sehr gut in die Umgebung integriert: Die Hervorhebung der Syntax funktioniert ordnungsgemäß, die automatische Umbenennung von Variablen funktioniert ordnungsgemäß, Querverweise funktionieren ordnungsgemäß und alle anderen Slick [Racket] IDE-Funktionen. Mit anderen Worten, Hygiene schützt Sie nicht nur vor einfachen Fehlern wie der Erfassung von Variablen, sondern ermöglicht auch die formale Analyse Ihres Codes mit Tools, die für Common LISP einfach nicht existieren könnten. randomhacks.net/2002/09/13/hygienic-macros
Robert Harvey

Antworten:

6

Der Vorteil von Hygienemakros liegt nicht in der Sprachfähigkeit. Sie können Makros mit guter Hygiene schreiben gensymund zum richtigen Zeitpunkt sorgfältig zitieren / nicht zitieren. Hygienemakros sorgen jedoch für eine gute Hygiene Ihrer Makros. In dieser Hinsicht ist es ein bisschen wie eine Typprüfung.

Hygienemakros können auch Werkzeugvorteile haben. Die meisten hygienischen Makrosysteme legen strenge Kontrollen fest, was Ihr Makro tut und wie es es tut (z. B. können Sie keinen beliebigen Code ausführen, wenn ein durch Schema definiertes Makro syntax-caseerweitert wird). Dies kann das Schreiben von Programmen erleichtern, die Ihr Makro "verstehen", und zusätzliche Werkzeugunterstützung bieten.

Andererseits gibt es einige Fälle, in denen unhygienische Makros nützlich sein können. Wenn Sie beispielsweise tatsächlich eine Bindung für eine bestimmte Variable (z. B. anaphorische Makros ) erfassen möchten , haben Sie wahrscheinlich kein Glück, wenn Sie nur hygienische Makros haben.

Nathan Davis
quelle
2
gensymverhindert, dass das Makro versehentlich mit dem Makrobenutzer herumspielt, verhindert jedoch nicht, dass der Makrobenutzer mit dem Makro herumspielt. Zum Beispiel kann ein Makrobenutzer ifoder so etwas neu definieren . (Die Frage "Warum sollte jemand das tun?" Ist irrelevant. Dies ist ein einfaches Beispiel, das zeigt, dass es möglich ist, und es ist schwierig, über nicht hygienische Makros nachzudenken.)
Phil
2
Unhygienische Makros sind sicherlich nützlich. Ich bin mir bei Scheme nicht sicher, aber Racket hat viele "Hygiene-Biege" -Operationen. Die Makros der Sprache sind standardmäßig hygienisch. Sie machen dich nur sehr bewusst, wenn du gegen die Hygiene verstößt.
Phil