2012-12-27 7 views
16

こんにちは、私はClojureのを学んだし、私は何が起こっているか理解したい、私はなぜclojureのマップはprintlnでそのように動作しますか?

(map println '(1 2 3 4)) 

を入力したとき、私は

1 
2 
3 
4 

のようなものを期待しますが、私はこれがある

(1 
2 
nil 3 
nil 4 
nil nil) 

を得ました私が作った一例にすぎません。私はちょうど何が起こっているのか理解したい。怠け者とは何か?

+4

一般的なアドバイスの束を返すことがわかります:マップ操作のために副作用の機能を使用しないでください – Ankur

答えて

29

(map println ...)の実行結果は、printlnを実行した結果のコレクションであり、これはnilです。結果はREPLが印刷する(nil nil nil nil)のコレクションです。 これを印刷している間にprintln呼び出しもREPLに出力して、2つが混在するのを確認します。

あなたはそれを印刷せずにこれを定義する場合:結果は怠惰なので

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

何も最初は起こりません。我々はdorun

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

使用してそれを印刷せずにそれを実現した場合、私たちは、それぞれのprintlnの副作用、その後、nilであるdorunの戻り値を参照してください。我々はそれに

user=> result 
(nil nil nil nil) 

を評価した結果の内容を見て、それがnil