2017-05-08 96 views
1

從我讀的地方看,如果你將一個新值綁定到Clojure中的一個動態變量,那麼這個新值只能在該線程中使用。動態變量和線程/睡眠

因此,爲了測試,我創建了這個代碼:

(def *dynamic-var* "dynamic var") 

(defn run-it [] 
    (future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*))) 
    (future (Thread/sleep 1000) (println *dynamic-var*))) 

我的問題是:爲何第一個線程(必須打印的「新價值」)從未運行?它從不向控制檯輸出「新值」。

回答

1

的問題是,你需要標記您的VAR動態與元數據:

(def ^:dynamic *dynamic-var* "dynamic var") 

(defn run-it [] 
    (future (binding [*dynamic-var* "new-value"] (Thread/sleep 3000) (println *dynamic-var*))) 
    (future (Thread/sleep 1000) (println *dynamic-var*))) 

隨着^:dynamic補充說,當你運行(run-it)它會打印出:大概

dynamic var 
new-value 

沒有了它你看到一條警告信息:

Warning:dynamic-var未聲明爲動態,因此不能動態重新綁定,但其名稱暗示了其他情況。請註明^:dynamic dynamic-var或更改名稱。

+0

謝謝,明白了!我正在從靜態類型化Java轉換爲動態類型化Clojure。我習慣於IDE的支持,並且犯這麼多錯誤,因爲這個工具並沒有警告我。你提到的「警告」實際上並沒有出現。謝謝! –

+0

不客氣!當我在REPL中運行代碼時,我收到了警告,我沒有檢查它是否在REPL之外運行時是否打印。 –