Clojure期货
我很难理解这个例子的要点:Clojure期货,clojure,Clojure,我很难理解这个例子的要点: (let [result (future (println "this prints once") (+ 1 1))] (println "deref: " (deref result)) (println "@: " @result)) 请注意,字符串“this prints one”实际上只打印一次,即使您取消对未来的两次引用。这表明future的主体只运行了一次,结果2被缓存 我不明白;即使不取消对未来的引用,字
(let [result (future (println "this prints once")
(+ 1 1))]
(println "deref: " (deref result))
(println "@: " @result))
请注意,字符串“this prints one”实际上只打印一次,即使您取消对未来的两次引用。这表明future的主体只运行了一次,结果2被缓存
我不明白;即使不取消对未来的引用,字符串也将打印一次。这个例子应该教什么?未来在一个单独的线程中执行附带的代码,并立即开始执行,这样即使您没有引用结果值,它也会运行代码
我猜作者想表明,当您多次取消引用时,
future
主体不会被重新执行。future在单独的线程中执行包含的代码,并立即开始执行,因此即使您不引用结果值,它也会运行代码
我猜作者想表明,当您多次取消引用时,
未来
主体将不会被重新执行。我同意这是微妙的。这一点是为了表明future
是一次性评估。当然,println
副作用会发生,无论您是否取消“结果”。事实上,正如您所注意到的,副作用发生时不会在以后取消“结果”。仅仅绑定“结果”会导致println
副作用发生
更重要的是,这里的想法是,两次显式地取消“结果”的定义不会导致它被计算(或绑定)两次。换句话说,它不会两次引起println
副作用。您在deref
it时都会得到缓存值2
有人可能会认为两次对其进行解引用会导致它被绑定两次,因此执行
println
两次。但事实并非如此。相反,您只需获得一次缓存的、已解除引用的值。这里的重点是,副作用发生在绑定时,而不是解除绑定时,两次解除绑定不会导致第二次绑定。我同意这很微妙。这一点是为了表明future
是一次性评估。当然,println
副作用会发生,无论您是否取消“结果”。事实上,正如您所注意到的,副作用发生时不会在以后取消“结果”。仅仅绑定“结果”会导致println
副作用发生
更重要的是,这里的想法是,两次显式地取消“结果”的定义不会导致它被计算(或绑定)两次。换句话说,它不会两次引起println
副作用。您在deref
it时都会得到缓存值2
有人可能会认为两次对其进行解引用会导致它被绑定两次,因此执行
println
两次。但事实并非如此。相反,您只需获得一次缓存的、已解除引用的值。这里的要点更多的是,副作用发生在绑定时,而不是解除绑定时,两次取消引用不会导致第二次绑定。很可能只是一个简单的事实,即未来只评估一次,多个取消引用操作不会触发重新执行。很可能只是一个简单的事实,即未来只评估一次,多个取消引用操作不会触发重新执行重新执行。