Цикл по векторам - PullRequest
       26

Цикл по векторам

12 голосов
/ 16 декабря 2011

Я новичок в Clojure и обнаружил, что когда я зацикливаюсь на этом векторе в clojure, используя понимание списка, в конце я получаю nil s.

(def myVec [1,2,3])

user=> (for [x myVec] (println x))
(1
2
3
nil nil nil)

Я получаю то же самое, используя map

user=> (map println myVec)
(1
2
3
nil nil nil)

Что вызывает печать nill в этих случаях?

Ответы [ 3 ]

9 голосов
/ 16 декабря 2011

for и map создают новую ленивую последовательность с каждым элементом в исходном векторе, замененным результатом (println element), а println возвращает ноль.

Вы не должны бытьиспользуя for и map для выполнения побочных эффектов (таких как печать) на элементах.Для этого используйте doseq.

7 голосов
/ 16 декабря 2011

Те nil возвращаемое значение println. Каждый раз, когда вы звоните

(println "something")

функция println печатает something на стандартном выходе и затем возвращает nil. Общий эффект в вашем коде состоит в том, что вы видите все побочные эффекты (I / O) всех вызовов println, затем REPL печатает возвращаемое значение, полученное от каждого вызова (например, три раза nil).

1 голос
/ 16 декабря 2011

nil - это значение, возвращаемое println, поэтому вы видите напечатанные строки, за которыми следует сопоставленный список значений nil.

...