为啥 clojure 的地图在 println 中表现得那样?

Posted

技术标签:

【中文标题】为啥 clojure 的地图在 println 中表现得那样?【英文标题】:why does clojure's map behave that way with println?为什么 clojure 的地图在 println 中表现得那样? 【发布时间】:2012-12-13 07:22:47 【问题描述】:

您好,我正在学习 clojure,我想了解当我键入时发生了什么

(map println '(1 2 3 4))

我期待类似的东西

1
2
3
4

但我得到了

(1
2
nil 3
nil 4
nil nil)

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

【问题讨论】:

一般建议:地图操作不要使用副作用函数 【参考方案1】:

(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)

并看到它返回了一堆nils

【讨论】:

以上是关于为啥 clojure 的地图在 println 中表现得那样?的主要内容,如果未能解决你的问题,请参考以下文章

在 Clojure 中,如何合并两个地图向量?

为啥我不能在“|”处分开在clojure中[重复]

嵌套地图的Clojure Zipper压制TRIE

Clojure嵌套地图-更改值

如何使用assoc-in更新地图中的多个值? (Clojure的)

为啥我在 Luminus (Clojure) 中看到参数不匹配错误?