(take 2 (for [x (range 10)
:let [_ (println x)]
:when (even? x)] x))
>> (* 0
* 1
* 2
* 3
* 4
* 5
* 6
* 7
* 8
* 9
0 2)
私は私が非常に密集しているだけだと思いました。しかし、いいえ、Clojure は実際には遅延シーケンス (利用可能な場合) の最初の 32 要素を評価することがわかりました。ああ。
でfor
再帰呼び出しがありました:let
。計算が深さ優先ではなく幅優先で進行しているように見える理由について、私は非常に興味がありました。再帰ツリーのすべての上位ブランチをたどっていくと、計算 (公平を期すために、メモリではありません) が爆発していたようです。Clojure の 32 チャンクは、コードの論理的な意図が深さ優先であったにもかかわらず、幅優先評価を強制していました。
とにかく、遅延シーケンスの 32 チャンクではなく 1 チャンクを強制する簡単な方法はありますか?