2012-01-16 13 views
10

Estoy tratando de usar la función dotrace del espacio de nombres clojure.tools.trace.Por qué estoy recibiendo No se puede vincular dinámicamente una var no dinámica?

(dotrace [my-function] (my-function 5)) 

Pero tengo este error:

IllegalStateException Can't dynamically bind non-dynamic var: my-ns/my-function clojure.lang.Var.pushThreadBindings (Var.java:339)

¿Qué significa? ¿Por qué lo estoy obteniendo?

(estoy usando Clojure 1.3)

+0

¿Se puede especificar también el código para my-function? – Ankur

Respuesta

18

Creo que se necesita para declarar su función de ser vinculados dinámicamente, por ejemplo,

(def ^:dynamic my-function 
    (fn [x] .....)) 

La razón de esto es porque si usted no pide explícitamente una var dinámico, Clojure (1.3 hacia arriba) hará que sea no dinámica como la optimización del rendimiento.

+0

Gracias! ¿Pero no debería ser esto 'defn'? –

+0

O bien 'def' o' defn' deberían estar bien, puede usar cualquiera de los dos para definir su función (editado para dejar en claro) – mikera

Cuestiones relacionadas