2012-01-16 15 views
10

Sto provando ad utilizzare la funzione dotrace dello spazio dei nomi clojure.tools.trace.Perché sto ricevendo Impossibile legare dinamicamente var non dinamico?

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

Ma ho ottenuto questo errore:

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

Che cosa significa? perché lo sto prendendo?

(sto usando Clojure 1.3)

+0

È possibile specificare anche il codice per my-function? – Ankur

risposta

18

penso che è necessario dichiarare la funzione ad essere dinamicamente legato, per esempio

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

La ragione di ciò è perché se non esplicitamente chiedere un var dinamica, Clojure (1.3 verso l'alto) renderà non dinamico come ottimizzazione delle prestazioni.

+0

Grazie! Ma questo non dovrebbe essere "defn"? –

+0

O def o 'defn dovrebbe andare bene, puoi usare o per definire la tua funzione (modificato per chiarire) – mikera

Problemi correlati