为什么Clojure中的map在使用println时会表现出那种行为?

17

你好,我正在学习Clojure,想要理解当我输入以下内容时发生了什么:

(map println '(1 2 3 4))

我原本期望有类似于:

1
2
3
4

但是我得到了

(1
2
nil 3
nil 4
nil nil)

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


4
通用建议:不要在映射操作中使用具有副作用的函数。 - Ankur
1个回答

31
运行(map println ...)的结果是运行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的返回值nil。然后我们可以通过评估它来查看result的内容

user=> result
(nil nil nil nil)

看到它返回一堆 nil


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接