2012-01-16 85 views
10

我正在嘗試使用clojure.tools.trace命名空間的dotrace函數。爲什麼我得到不能動態綁定非動態var?

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

但我得到這個錯誤:

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

是什麼意思?爲什麼我得到它?

(我使用的Clojure 1.3)

+0

你也可以指定my函數的代碼嗎? – Ankur 2012-01-16 04:11:19

回答

18

我認爲你需要聲明你的函數作爲動態綁定,例如

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

的原因是因爲如果你不明確要求動態無功,Clojure的(1.3以上)將使非動態的性能優化。

+0

謝謝!但是這不應該是'defn'嗎? – 2012-07-18 10:09:04

+0

「def」或「defn」都應該沒問題,你可以用它來定義你的功能(編輯清楚) – mikera 2012-07-18 10:18:18