你好,我正在学习Clojure,想要理解当我输入以下内容时发生了什么:
(map println '(1 2 3 4))
我原本期望有类似于:
1
2
3
4
但是我得到了
(1
2
nil 3
nil 4
nil nil)
这只是我编造的一个例子。我只是想理解发生了什么。也许与懒惰有关?
你好,我正在学习Clojure,想要理解当我输入以下内容时发生了什么:
(map println '(1 2 3 4))
我原本期望有类似于:
1
2
3
4
但是我得到了
(1
2
nil 3
nil 4
nil nil)
这只是我编造的一个例子。我只是想理解发生了什么。也许与懒惰有关?
(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