Зацикливание по векторам

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

(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)

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

Ответ 1

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

(println "something")

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

Ответ 2

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

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

Ответ 3

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