3

clojure で次のコードを検討してください。

(let [a (find-a), b (find-b)] (println a) (println b) )

ここで、b はシーケンスです。関数 find-a にはいくつかの println ステートメントもあります。標準出力で期待されるのは、a、find-a、b の println ステートメントの結果です。ただし、私が得るのは、b の一部である a は、find-a の残りの b の println ステートメントの結果です。

これは、シーケンスの遅延評価によるものですか?

4

1 に答える 1

6

このコードには本質的に怠惰なものはありません。すべて正しい順序で実行する必要があります。

ただし、内容によっては、aそれらbの内部に遅延が埋め込まれている可能性があり、実行されたときにのみ実行(println a)(println b)れます。特に、aおよびがmapbなどで作成された遅延シーケンスである場合、シーケンスの後半部分は、printlnステートメント内で実行が強制された場合にのみ評価されます。それより具体的には、 と の内部構造を記述する必要があります。ab

私は実際には、問題はバッファがフラッシュされていないことが原因である可能性があると考えています- Clojure - Side Effects Happening Out Of Orderを参照してください

于 2012-04-24T08:31:09.233 に答える