Зацикливание по векторам
Я новичок в 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.