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:
- Wie unterscheidet
gensym
sich von Hygienemakros? - Was bieten Racket-Makros, was Clojure nicht bietet? (sei es Sicherheit, Zusammensetzbarkeit oder irgendetwas)
Antworten:
Der Vorteil von Hygienemakros liegt nicht in der Sprachfähigkeit. Sie können Makros mit guter Hygiene schreiben
gensym
und 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-case
erweitert 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.
quelle
gensym
verhindert, dass das Makro versehentlich mit dem Makrobenutzer herumspielt, verhindert jedoch nicht, dass der Makrobenutzer mit dem Makro herumspielt. Zum Beispiel kann ein Makrobenutzerif
oder 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.)