2013-03-07 13 views
6
(defn seq-trial 
    [] 
    (map #(do (println "hello " %) (inc %)) (range 10))) 

(take 3 (seq-trial)) 

Der Code snippt erwartet oben, wenn druckt die ausgewertet folgende -Faulheit nicht wie

(hallo 0 hallo 1 hallo 2 hallo 3 hallo 4 hallo 5 hallo 6 hallo 7 hallo 8 hallo 9 1 2 3)

Da Karte eine faule Sequenz kehrt I dies nur zu drucken, erwartet -

(hallo 0 hallo 1 hallo 2 1 2 3)

Warum die ganze Liste hier ausgewertet wird?

Antwort

8

Dies ist wegen einer Leistungsoptimierung namens Chunking. Im Wesentlichen wird die Sequenz in Gruppen von n Elementen, sogenannten Chunks, realisiert. Dies bedeutet, dass Sie mit irgendwelchen Nebenwirkungen in Ihrer Zuordnungsfunktion vorsichtig sein müssen. Das Endergebnis ist korrekt tho, erhalten Sie immer noch eine Sequenz der richtigen Länge

Die Standard-Chunk-Größe ist 32, also, wenn Sie Ihren Bereich auf einen Wert größer als das erhöhen, werden Sie verstehen, was ein bisschen besser geht:

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 

Wenn Sie es vermeiden müssen Chunking sind options available

+2

Nebenwirkungen und lazy evaluation nicht mischen. –

Verwandte Themen