Para hacer esto, en esencia, tendría que volver a escribir la macro exactamente como el original simplemente sustituyendo un nombre diferente (por supuesto, usted usaría defmacro
para hacer esto). Esa es la única forma en que esto es posible, ya que las macros no devuelven un valor, sino que simplemente escriben el código que se evaluará posteriormente.
Def requiere enlazar un nombre a un valor en lugar de un bloque de código.
(def init símbolo?)
Crea y pasantes o localiza una var global con el nombre del símbolo y un espacio de nombres del valor del espacio de nombres actual ( ns). Si se proporciona init, se evalúa y el enlace de raíz de la var se establece en el valor resultante. Si no se proporciona init, la vinculación de la raíz de var no se ve afectada. def siempre se aplica a la encuadernación de raíz, incluso si la var está encuadernada en el punto donde se llama a def. def produce la var misma (no su valor). Lanza una excepción si el símbolo ya está en el espacio de nombres y no está asignado a una var.
de Clojure: Special Forms
macros no evalúan sus formas:
macros son funciones que manipulan formas, lo que permite la abstracción sintáctica. Si el operador de una llamada es un símbolo que nombra una var global que es una función macro, se llama a esa función macro y se pasa el a los formularios del operando no evaluado [cursiva mía]. El valor de retorno de la macro se evalúa en su lugar.
de Clojure: Evaluation
En suma, el punto de la macro es retrasar la evaluación, por lo que no puede proporcionar un valor para def
de unirse a un símbolo.
Ya no existe 'clojure.contrib.def'. https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub