Ответ 1
результат выполнения (map println ...)
представляет собой набор результатов выполнения println, который равен nil. Таким образом, результат представляет собой набор (nil nil nil nil)
, который печатает REPL.
в то время как он печатает это, вызовы println также печатают там вывод в REPL, поэтому вы видите, что эти два смешались вместе.
если вы определяете это без его печати:
user=> (def result (map println [1 2 3 4]))
#'user/result
ничего не происходит изначально, потому что результат ленив. Если мы реализуем это без печати, используя dorun
user=> (dorun result)
1
2
3
4
nil
мы видим побочные эффекты каждого println, а затем возвращаемое значение dorun
, которое равно нулю. Затем мы можем посмотреть содержимое результата, оценив его
user=> result
(nil nil nil nil)
и увидите, что он возвращает связку nil