In Common LISP können Sie Folgendes tun
(macro lambda (x) (list (quote car) (list (quote cdr) x)))
Es sieht so aus, als ob dies in Clojure nicht möglich ist (ein anonymes Makro).
- Ist das wahr?
- Warum wurde dies nicht berücksichtigt?
In Common LISP können Sie Folgendes tun
(macro lambda (x) (list (quote car) (list (quote cdr) x)))
Es sieht so aus, als ob dies in Clojure nicht möglich ist (ein anonymes Makro).
Es gibt einige macrolet
(oder andere Dinge) in clojure.contrib.macro-utils
. Allerdings riecht es für mich ein wenig nach Hacking. Aufnahme in clojure.core
ist auf dem TODO-Radar, hat aber im Moment keine hohe Priorität.
EDIT: Siehe auch hier http://dev.clojure.org/display/design/letmacro .
Nach meinem Verständnis (aus der Lektüre die Dokumentation y die Quelle ), dass Clojure derzeit (ab Version 1.2) nur benannte Makros unterstützt, die mit defmacro definiert werden.
Es ist jedoch möglich, die Interna von Clojure zu missbrauchen, um eine Art anonymes Makro zu erhalten, indem man direkt die Java-Funktion Var.setMacro() Das ist es, was defmacro unter der Haube verwendet, um Makros zu konstruieren.
z.B. können Sie tun:
(def macro-var (var (fn [...] ...)))
(.setMacro macro-var)
Und der Clojure-Reader interpretiert dann die in macro-var enthaltene var als Makro. Allerdings müssen Sie herausfinden, wie Sie alles korrekt definieren, und das könnte in zukünftigen Versionen von Clojure kaputt gehen.
Clojure 1.3 (derzeit in der Alpha-Phase, aber voll einsatzfähig) bringt verschiedene andere Verbesserungen, z.B. Symbolmakros, und könnte daher auch einen Blick wert sein.
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.