为什么clojure的地图与println一样?

MLm*_*aze 16 clojure map println

您好我正在学习clojure,我想了解当我打字时发生了什么

(map println '(1 2 3 4))
Run Code Online (Sandbox Code Playgroud)

我期待类似的东西

1
2
3
4
Run Code Online (Sandbox Code Playgroud)

但我明白了

(1
2
nil 3
nil 4
nil nil)
Run Code Online (Sandbox Code Playgroud)

这只是我编写的一个例子.我只是想了解发生了什么.也许与懒惰有关?

Art*_*ldt 30

运行(map println ...)的结果是运行println的结果的集合,它是nil.因此结果是(nil nil nil nil)REPL打印的集合.虽然它正在打印这个println调用也打印输出到REPL,所以你看到两个混合在一起.

如果你定义它而不打印它:

user=> (def result (map println [1 2 3 4]))
#'user/result
Run Code Online (Sandbox Code Playgroud)

最初没有任何事情发生,因为结果很懒.如果我们意识到它没有打印它使用dorun

user=> (dorun result)
1
2
3
4
nil
Run Code Online (Sandbox Code Playgroud)

我们看到每个println的副作用,然后返回值dorun为零.然后我们可以通过评估它来查看结果的内容

user=> result
(nil nil nil nil)
Run Code Online (Sandbox Code Playgroud)

并看到它返回了一堆nils