Почему карта clojure ведет себя так же с помощью println? - программирование
Подтвердить что ты не робот

Почему карта clojure ведет себя так же с помощью println?

Здравствуйте, я изучаю clojure, и я хочу понять, что происходит, когда я печатаю

(map println '(1 2 3 4))

Я ожидал чего-то вроде

1
2
3
4

но я получил

(1
2
nil 3
nil 4
nil nil)

Это просто пример, который я составил. Я просто хочу понять, что происходит. Может быть, что-то связано с ленинностью?

4b9b3361

Ответ 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