Clojure的未来

时间:2016-03-06 07:01:47

标签: clojure

我很难理解这个例子的重点:

(let [result (future (println "this prints once")
                 (+ 1 1))]
   (println "deref: " (deref result))
   (println "@: " @result))

The author explains:

  

请注意,字符串“this prints once”确实只打印一次,即使您将未来取消引用两次。这表明未来的身体只运行一次,结果2缓存了。

我不明白;即使没有取消引用未来,字符串也会打印一次。这个例子应该教什么?

2 个答案:

答案 0 :(得分:5)

我同意这很微妙。这一点是为了表明future是一次性评估。当然,println副作用是否发生,无论你是否结果"结果"或不。事实上,副作用发生时没有后来的反应"结果"你已经注意到了。仅仅具有约束力"结果"导致println副作用发生。

更重要的是,这里的想法是解决"结果"两次明确地 not 导致它被评估(或绑定)两次。换句话说,它不会导致println副作用两次。您deref的两倍都会得到缓存值2。

有人可能期望将其解析两次会导致它被绑定两次,因此执行println两次。但这种情况并非如此。相反,您只需获得一次缓存的deref-ed值。这里的要点更多的是在结合时发生副作用,而不是在减少时发生副作用,并且反转两次不会引起第二次结合。

答案 1 :(得分:2)

future在单独的线程中执行附带的代码并立即开始执行,这样即使您没有引用结果值,它也会运行代码。

我想作者想要表明future身体在你多次取消引用时不会被重新执行。