16

你好我正在学习clojure,我想了解发生了什么,当我输入

(map println '(1 2 3 4))

我期待像

1
2
3
4

但我得到了

(1
2
nil 3
nil 4
nil nil)

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

4

1 回答 1

31

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

user=> result
(nil nil nil nil)

并看到它返回一堆nils

于 2012-12-27T23:16:33.777 回答