私は Clojure の先物を理解しようとしています。一般的な Clojure の本から例を見てきました。並列計算に先物が使用されている例もあります (これは理にかなっているようです)。
しかし、誰かが O'Reilly の Programming Clojure の本から採用した簡単な例の動作を説明できることを願っています。
(def long-calculation (future (apply + (range 1e8))))
これを逆参照しようとすると、
(time @long-calculation)
正しい結果 (4999999950000000) が返されますが、私のマシンではほぼ瞬時 (0.045 ミリ秒) です。
しかし、実際の関数を呼び出すと、
(time (apply + (range 1e8)))
正しい結果も得られますが、所要時間ははるかに長くなります (〜 5000 ミリ秒)。
未来を逆参照すると、式が評価される新しいスレッドが作成されるというのが私の理解です。その場合、約5000ミリ秒もかかると予想されます。
逆参照された未来が正しい結果をすぐに返すのはなぜですか?