2016-03-06 242 views
1

我有一個很難理解這個例子中的觀點:期貨Clojure中

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

The author explains:

注意,字符串「這個打印一次」確實只打印一次,即使你兩次解除未來。這表明未來的身體只運行一次,結果2被緩存。

我不明白;該字符串將打印一次,即使不提領未來。這個例子應該教什麼?

+3

最可能的僅僅是一個簡單的事實,即未來只評估一次,而多個解除引用操作不會觸發重新執行。 – zero323

回答

5

我同意這是微妙的。這一點是要表明future是一次性評估。當然,無論您是否參與「結果」,都會發生println副作用。事實上,副作用的發生並沒有像你所指出的那樣後來導致「結果」的惡化。僅僅綁定「結果」會導致println副作用發生。

更重要的是,這裏的想法是,將「結果」兩次明確地減去而不是使其被評估(或綁定)兩次。換句話說,它不會導致兩次的副作用println。你得到的緩存值爲2,兩次都是deref

有人可能會期望去掉兩次會導致它被綁定兩次,因此執行兩次println。但這種情況並非如此。相反,您只獲得一次緩存的deref-ed值。這裏的重點更多的是副作用發生在綁定時,而不是解除綁定,並且解除綁定兩次不會產生第二次綁定。

2

future在單獨的線程中執行隨附的代碼,並立即開始執行,因此即使未引用結果值,也會運行代碼。

我想作者想表明,future正文不會被重新執行時,你不止一次解除引用。