2014-07-09 10 views
5

Ich lese oft Debatten darüber, warum Hygenic Makros sind besser und dass Clojure Makro-System auf Common Lisp basiert und ist nicht hygienisch.Implementieren Schema Stil Makros in Clojure

Meine Frage ist: Kann ein Schema-Stil-Makro-System in Clojure implementiert werden und was sind einige Beispiele von Schema-Stil-Makros in anderen Lisps implantiert.

+1

Zu den Leuten, die stimmen, um das als "zu breit" zu schließen, stimme ich nicht überein. Es fragt nicht nur, ob etwas möglich ist, sondern auch nach Beispielen für die Umsetzung der Sache. Es ist eine spezifische Frage, die spezifisch beantwortet werden kann (wie ich es versucht habe). –

Antwort

5

Mit „Schema-style-Makro-System“, ich bin nicht sicher, ob Sie syntax-rules (das einfache Muster Stil-System) oder syntax-case (das flexibleres System, die zusammen mit datum->syntax meine, Sie lassen wirklich verbiegen oder Flach- aus Pausenhygiene).

Auch hat Racket syntax-parse, die ein bisschen einfacher zu verwenden als syntax-case und (unter anderem) macht es angenehm, Makros zu schreiben, die verständliche Fehlermeldungen geben.

Unabhängig davon, was Sie meinen, gibt es eine Clojure project that purports to implement aspects of all three. Aber ich habe es nicht ausprobiert und kann nicht dafür garantieren, wie erfolgreich es ist.

+1

Danke Greg, wenn also die Möglichkeit besteht, dass beide innerhalb einer Sprache existieren, warum sind die Menschen dann so aufeinander fixiert? – zcaudate

+1

@zcaudate Wenn Sie ein unhygienisches 'Define-Makro' haben, können Sie leicht jedes andere Makrosystem damit erstellen. Mit Schemas 'Syntax-Regeln' können nur die Standards (R5RS und R7RS-small) nicht. Hygiene ist so ziemlich eine Abstraktion, die Bugs reduziert und manche Leute wollen das eher als Macht. Die meisten Implementierungen haben beides. – Sylwester

2

Ich bin mir nicht sicher, dass es richtig ist zu sagen, dass Clojures Makrosystem nicht hygienisch ist. Eine ähnliche Diskussion, die ich gesehen habe, bezieht sich auf das Lisp-System für Leser-Makros (das Clojure nicht hat) als nicht hygienisch, weil es keinen Mechanismus gibt, der Leser-Makros in verschiedenen Modulen davon abhält, sich gegenseitig zu ersetzen. Es war eine explizite und absichtliche Entwurfsentscheidung, die Sprache so zu erstellen, dass Scheme-Style-Makros nicht enthalten waren.

Verwandte Themen