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

(take 3 (seq-trial)) 

Il codice snippt sopra quando valutato stampe il seguente -pigrizia non funziona come previsto

(ciao 0 ciao 1 ciao 2 ciao 3 ciao 4 ciao 5 ciao 6 ciao 7 ciao ciao 8 1 2 3)

Perché mappa restituisce una sequenza pigro mi aspettavo questo per stampare solo -

(ciao ciao 0 ciao 2 1 2 3)

Perché l'intero elenco valutato qui?

risposta

8

Ciò è dovuto all'ottimizzazione delle prestazioni denominata chunking. Essenzialmente la sequenza è realizzata in gruppi di n elementi chiamati blocchi. Ciò significa che è necessario fare attenzione con eventuali effetti collaterali nella funzione di mappatura. Il risultato finale è corretto, tuttavia ottieni una sequenza della lunghezza corretta restituita

La dimensione predefinita del blocco è 32, quindi se aumenti il ​​tuo intervallo a un valore maggiore di quello capirai cosa sta succedendo un po 'meglio:

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 

Se è necessario evitare la suddivisione in blocchi ci sono options available

+2

effetti collaterali e valutazione pigra non si mescolano. –