2009-08-23 12 views

Respuesta

8

Puede utilizar una macro:

user=> (defmacro def-function [& args] `(defn [email protected])) 
#'user/def-function 
user=> (def-function g [] 2) 
#'user/g 
user=> (g) 
2 

O puede utilizar clojure.contrib.def/defalias:

user=> (use 'clojure.contrib.def) 
nil 
user=> (defalias def-function defn) 
#'user/def-function 
user=> (def-function g [] 2) 
#'user/g 
user=> (g) 
2 
+3

Ya no existe 'clojure.contrib.def'. https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub

3

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.

+0

¡Gracias por la explicación! –

29

puede sonar (o de línea) ruidoso, pero

(def #^{:macro true} case #'cond) 

obras!

Cuestiones relacionadas