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

(take 3 (seq-trial)) 

Kod snippt powyżej gdy oceniano drukuje następujące -lenistwo nie działa prawidłowo

(cześć 0 cześć 1 cześć 2 cześć 3 cześć 4 cześć 5 cześć 6 cześć 7 cześć 8 cześć 9 1 2 3)

Ponieważ mapę zwraca lazy sekwencję I oczekiwaną tego celu wydrukowania -

(cześć 0 cześć 1 cześć 2 1 2 3)

Dlaczego cała lista oceniana tutaj?

Odpowiedz

8

Wynika to z optymalizacji wydajności zwanej chunking. Zasadniczo sekwencja jest realizowana w grupach o nazwie kawały. Oznacza to, że musisz zadbać o wszelkie skutki uboczne w swojej funkcji mapowania. Wynik końcowy jest poprawny, ale nadal otrzymujesz sekwencję o prawidłowej długości zwróconej

Domyślny rozmiar porcji to 32, więc jeśli zwiększysz zakres do wartości większej niż ta, zrozumiesz, co się dzieje lepiej:

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 

Jeśli trzeba unikać wyrwy są options available

+2

skutki uboczne i oceny leniwy nie mieszać. –

Powiązane problemy