Clojure的未来

Mah*_*dam 1 clojure

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

(let [result (future (println "this prints once")
                 (+ 1 1))]
   (println "deref: " (deref result))
   (println "@: " @result))
Run Code Online (Sandbox Code Playgroud)

作者解释说:

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

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

jma*_*svt 5

我同意这很微妙.这一点的关键是要表明这future是一次性评估.当然,println无论你是否反驳"结果" ,都会产生副作用.事实上,正如你所指出的那样,副作用发生时没有后来否定"结果".仅仅结合"结果"会导致println副作用发生.

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

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