2012-01-16 25 views
10

Tôi đang cố gắng sử dụng chức năng dotrace của không gian tên clojure.tools.trace.Tại sao tôi nhận được Không thể tự động liên kết var không động?

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

Nhưng tôi đã nhận lỗi này:

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

có nghĩa là gì? tại sao tôi nhận được nó?

(Tôi đang sử dụng Clojure 1.3)

+0

Bạn cũng có thể chỉ định mã cho chức năng của tôi không? – Ankur

Trả lời

18

Tôi nghĩ bạn cần khai báo chức năng của mình là bị ràng buộc động, ví dụ:

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

Lý do là vì nếu bạn không yêu cầu một biến động, Clojure (1,3 trở lên) sẽ làm cho nó không động như một tối ưu hóa hiệu suất.

+0

Cảm ơn! Nhưng điều này không nên là 'defn'? –

+0

Hoặc 'def' hoặc' defn' sẽ ổn, bạn có thể sử dụng một trong hai để xác định hàm của bạn (được chỉnh sửa để làm rõ) – mikera

Các vấn đề liên quan