您好,我正在学习Clojure,我想了解输入的内容

(map println '(1 2 3 4))


我期待像

1
2
3
4


但是我得到了

(1
2
nil 3
nil 4
nil nil)


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

最佳答案

运行(map println ...)的结果是运行println为nil的结果的集合。因此,结果是REPL打印的(nil nil nil nil)集合。
在打印此内容时,println调用还将打印输出输出到REPL,因此您会看到两者混合在一起。

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

user=> (def result (map println [1 2 3 4]))
#'user/result


最初没有任何反应,因为结果是惰性的。如果我们意识到了却没有使用dorun打印它

user=> (dorun result)
1
2
3
4
nil


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

user=> result
(nil nil nil nil)


并看到它返回了一堆nil

07-25 23:26
查看更多