《Clojure編程》第4章筆記。編程
總的感受,Clojure畢竟是基於JVM的在人間的工程化語言。不是純的無狀態純函數的在神間的lisp。後端
做爲後端語言,不可避免要處理計算中和代碼執行時序、線程等方面的事情。promise
這方面Clojure有大量的概念和模式,讓這些問題儘可能地簡化。和其餘語言有相似的地方,可是確實有本身的特點。app
這些東西基本上都是用def定義爲模塊ns下的var。相似全局可變var。(固然,定義在let裏也是能夠的異步
相同點:函數
1異步執行裏面的語句,也就是不等待執行完,就繼續執行下面的spa
2 均可以經過@ 和deref解引用取得結果。若是在沒計算完以前解引用,產生阻塞效果。線程
因此對解引用的執行者來講,不須要考慮被解引用的是什麼。code
deref能夠設置超時時間和返回值,@不行。blog
deref能夠apply到整個序列,而@不行。
因此,簡單狀況用@ 須要考慮超時,或者集合操做的時候再用deref
(def d (delay (println "running...") :done!)) (println (deref d)) (println @d)
running...:done!:done!
delay接受的是一堆代碼,把最後1個做爲返回值:done!
兩次解引用,其實只計算了1次,第二次就直接用第一次計算後的結果了。適合1次計算,屢次使用的場合。
若是d已經被求值,能夠用(realized? d)進行判斷
(deref (future (Thread/sleep 2000) :done!) 100 :impatient!)
隱式使用一個線程異步計算一些東西,而後解引用返回結果。
這裏用了deref+超時 因此100ms就返回了:impatient!,不會等待2sec,返回:done!
只聲明,不包含如何計算的代碼。
(def a (promise))
而後A經過deliver 投遞數據, B經過解引用獲得結果。
做爲一次性、單值的管道。