2012-12-27 9 views
16

Ciao sto imparando clojure e voglio capire che cosa sta succedendo, quando digitoperché la mappa di clojure si comporta in questo modo con println?

(map println '(1 2 3 4)) 

mi aspettavo qualcosa di simile

1 
2 
3 
4 

ma ho avuto

(1 
2 
nil 3 
nil 4 
nil nil) 

Questo è solo un esempio che ho inventato Voglio solo capire cosa sta succedendo. Forse qualcosa a che fare con la pigrizia?

+4

Informazione generale: Non usare le funzioni di effetto collaterale per operazioni mappa – Ankur

risposta

29

il risultato di esecuzione (map println ...) è una raccolta del risultato dell'esecuzione di println che è nullo. Quindi il risultato è una raccolta di (nil nil nil nil) stampata dal REPL. mentre sta stampando, le chiamate println stampano anche l'output in REPL in modo da vedere i due mixati insieme.

se si definisce questo senza stamparlo:

user=> (def result (map println [1 2 3 4])) 
#'user/result 

non succede nulla inizialmente perché risultato è pigro. Se ci rendiamo conto che senza stamparlo utilizzando dorun

user=> (dorun result) 
1 
2 
3 
4 
nil 

vediamo gli effetti collaterali di ogni println e poi il valore di ritorno di dorun, che è pari a zero. Possiamo quindi esaminare il contenuto del risultato, valutando lo

user=> result 
(nil nil nil nil) 

e vedere che restituisce un po 'di nil s

Problemi correlati