《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经过解引用获得结果。
做为一次性、单值的管道。