2010-11-21 18 views
7

¿Hay alguna forma de definir una macro nueva bajo el nombre def en Clojure? I defmacro ed uno nuevo después de intentar :refer-clojure :exclude el original, pero utilizó la definición incorporada de todos modos.Redefiniendo "def" en Clojure

Intenté habilitar las definiciones de función de estilo de esquema ((def (f x y) ...) como (defn f [x y] ...)) utilizando el siguiente código.

(defmacro def 
    [ id & others ] 
    (if (list? id) 
     `(defn ~(first id) [[email protected](rest id)] [email protected]) 
     `(def ~id [email protected]))) 

Respuesta

6

def no es un macro, es un formulario especial. Interno un símbolo en el espacio de nombres actual. No puede redefinir formularios especiales, pero incluso si pudiera, ¿cómo obtendría el mismo comportamiento?

La manera más directa es escribir macro define en la base de def y defn. Si desea utilizar def palabra, se puede escribir un envoltorio replace-my-def-with-normal-def alrededor de todo el módulo, es decir

(replace-my-def-with-normal-def 

    (def x 0) 
    (def y (inc x)) 
    (def z (inc y)) 
    (def (my-func a b) (println a b)) 

) 

pero no estoy seguro de que no se romperá otras definiciones, que dependen de def (por ejemplo, defn)

+4

No puede redefinir formularios especiales. –

2

Puede crear una macro con el nombre de una forma especial (como si), pero no lo ayudará. Los formularios especiales se evalúan antes que las macros, por lo tanto, si tiene una macro y una forma especial del mismo nombre, siempre se usará el formulario especial. Más información aquí http://clojure.org/evaluation.

Cuestiones relacionadas