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

时间:2012-12-27 23:14:25

标签: map clojure println

你好我正在学习clojure,我想知道当我输入

时发生了什么
(map println '(1 2 3 4))

我期待像

这样的东西
1
2
3
4

但我得到了

(1
2
nil 3
nil 4
nil nil)

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

1 个答案:

答案 0 :(得分:30)

运行(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的返回值,它是零。然后我们可以通过评估它来查看结果的内容

user=> result
(nil nil nil nil)

并看到它返回了一堆nil s