6
(defn seq-trial
  []
  (map #(do (println "hello " %) (inc %)) (range 10)))

(take 3 (seq-trial))

上記のコード スニペットを評価すると、次のように出力されます -

(こんにちは 0 こんにちは 1 こんにちは 2 こんにちは 3 こんにちは 4 こんにちは 5 こんにちは 6 こんにちは 7 こんにちは 8 こんにちは 9 1 2 3)

map は遅延シーケンスを返すため、これは印刷のみを期待していました-

(こんにちは 0 こんにちは 1 こんにちは 2 1 2 3)

ここでリスト全体が評価されるのはなぜですか?

4

1 に答える 1

8

これは、チャンキングと呼ばれるパフォーマンスの最適化によるものです。基本的に、シーケンスは、チャンクと呼ばれるn 個のアイテムのグループで実現されます。これは、マッピング関数の副作用に注意する必要があることを意味します。最終結果は正しいですが、正しい長さのシーケンスが返されます

デフォルトのチャンク サイズは 32 です。そのため、範囲をそれよりも大きな値に増やすと、何が起こっているのかが少しよくわかります。

user> (defn seq-trial
  []
  (map #(do (println "hello " %) (inc %)) (range 100)))

user> (take 3 (seq-trial))
hello  0 ; 32 item 'chunk' realized...
hello  1

...

hello  30
hello  31
(1 2 3)  ; the expected returned value

チャンキングを避ける必要がある場合は、利用可能なオプションがあります

于 2013-03-07T10:03:13.580 に答える