2012-08-24 45 views
5

Có một số bài đăng trên blog hơi cũ ra có khuyến cáo thận trọng khi trộn các biến động, bindingpmap, ví dụ: here, nơi mà chúng tôi có được đoạn mã sau:thay đổi tương tác ràng buộc & pmap?

user=> (def *foo* 5) 
#'user/*foo* 
user=> (defn adder 
      [param] 
      (+ *foo* param)) 
#'user/adder 
user=> (binding [*foo* 10] 
     (doseq [v (pmap adder (repeat 3 5))] 
      (println v))) 
10 
10 
10 
nil 

Nhưng đó không phải là những gì xảy ra khi tôi chạy mã (thay đổi dòng đầu tiên để (def ^:dynamic *foo* 5)). Tôi nhận được ba 15 s làm đầu ra (sử dụng Clojure 1.4), giống như bạn mong đợi không mong muốn — có nghĩa là, với sự thay đổi trong biểu mẫu ràng buộc được xem bởi hàm được chuyển đến pmap. Có cách thức ràng buộc thread-local và pmap tương tác thay đổi? Tôi không thể tìm thấy tài liệu này ở bất cứ đâu.

Trả lời

5

bắt đầu bằng 1.3 bộ liên kết cục bộ được gửi đến pmap cùng với hàm. Vì vậy, miễn là bạn đánh dấu var ^: dynamic thì đây không còn là vấn đề nữa. Tính năng này nó được gọi là Binding Conveyance và được bao gồm trong 1,3 changelog:

từ: https://github.com/clojure/clojure/blob/1.3.x/changes.txt

 
Clojure APIs that pass work off to other threads (e.g. send, send-off, pmap, future) now convey the dynamic bindings of the calling thread: 

    (def ^:dynamic *num* 1) 
    (binding [*num* 2] (future (println *num*))) 
    ;; prints "2", not "1" 
+0

cảm ơn! tài liệu này ở đâu? nó không có trong http://dev.clojure.org/display/doc/1.3 –

+0

chỉnh sửa để bao gồm các tham chiếu –

+0

Cảm ơn! Đánh giá cao. –

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