您好,我正在学习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