Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure期货_Clojure - Fatal编程技术网

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
两次。但事实并非如此。相反,您只需获得一次缓存的、已解除引用的值。这里的要点更多的是,副作用发生在绑定时,而不是解除绑定时,两次取消引用不会导致第二次绑定。

很可能只是一个简单的事实,即未来只评估一次,多个取消引用操作不会触发重新执行。很可能只是一个简单的事实,即未来只评估一次,多个取消引用操作不会触发重新执行重新执行。