4 Stimmen

Anonyme Makros in Clojure

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).

  1. Ist das wahr?
  2. Warum wurde dies nicht berücksichtigt?

4voto

kotarak Punkte 16848

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 .

1voto

mikera Punkte 103423

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.com

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.

Powered by:

X