2014-05-11 14 views
1

我正在讀上瓦爾Clojure的頁面(這裏:http://clojure.org/vars),其中規定,當var標記動態binding是線程本地:Clojure的結合不是爲我工作

默認瓦爾是靜態的,但與元數據定義的每個線程綁定瓦爾它​​們標記爲動態可通過宏結合和內螺紋來建立他們

,有點晚服從堆棧規則:

使用綁定創建的綁定不能被任何其他線程看到。同樣,綁定可以被分配給綁定,這爲嵌套的上下文在調用堆棧之前與其之前的代碼進行通信提供了一種手段。此功能只能通過將元數據標記設置爲「啓用」:dynamic爲true,如上面的代碼塊中所示。

所以我決定嘗試了這一點:

(def ^:dynamic x 0) 
(defn print-x [] (prn x)) 
(binding [x 100] @(future (print-x))) 

而且我希望看到0打印,因爲將來使操作在一個新的線程來執行,但結果我得到的是10。我還注意到binding文檔沒有提及任何線程本地綁定,而有一個函數(或宏),它討論了線程本地綁定,並且有一個用於指定綁定的替代(如果問我的話,可以不要這樣做)但這並不符合我的期望。

任何想法?我必須失去一些明顯的東西。

回答

2

future函數會自動將其綁定到遠程線程。這發生在​​,這與bound-fn類似,您可以在自己的代碼中用於相同的目的。