2012-04-24 18 views
3

はClojureの中に以下のコードを考えてみましょう:Clojureは、遅延評価の問題

([B(見つける-B)を、(見つけ-A)]を (のprintln A) (のprintln B) てみましょう)

ここで、bはシーケンスです。関数find-aにはprintln文がいくつかあります。 標準出力に表示されると予想されるのは、 a、 find-aのprintlnステートメントの結果です。 b。 しかし、私が得ることは次のとおりです。 a、 b、 find-aのprintlnステートメントの結果、 rest of b。

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

答えて

6

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

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

私は実際に問題が原因バッファにフラッシュ得ていないことができることが疑われる - Clojure - Side Effects Happening Out Of Order

+0

のprintlnは自動的にフラッシュする必要があります参照してください。一般に、プリントを使用している場合は、手動でフラッシュすることについて心配する必要があります。 –