2024 clojure状态调查!分享您的想法。

欢迎!请参阅关于页面以获取更多有关此功能的详细信息。

0
Clojure

将第一个 map 作为 reduce 的初始值设置
以避免在第一个 map 上调用 merge-entry(一系列 contains? 调用等)。

4 个答案

0

由 edtsch 发表的评论

测试通过。

0

由 jafingerhut 发表的评论

Edward,你的补丁将表达式 (or m1 {}) 替换为 m1。它在2008年10月16日的一个提交中从 m1 更改为 (or m1 {}),其中有描述文“改进 merge、merge-with 中的 nil 处理”,因此我很确定最好将其保留为 (or m1 {})。我相信意图是允许 merge-with 的所有地图参数除了一个之外都是 nil,并且一切仍然可以工作。

避免一个合并调用其余补丁在我看来似乎是合理的。

如果您的更改不是用第一个 map 而是用链表中的第一个非 nil 项调用来保留第一个非 nil 地图上的任何元数据,那就更好了,然后是该链表后面的其余部分。

0
_由 edtsch 发表的评论_

我想出了`reduce1`确实传递了链表的头部给我。 :) (https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L887)
但第一个nil参数的情况仍然有效。如果我有误,请指出。

我对`(or m1 {})`不是很确定。我看不出任何可能发生的问题。也许自2008年以来,内部使用的函数的行为已经改变了。

(contains? nil :a) ;=> false
(assoc nil :a 1) ;=> {:a 1}
(get nil :a) ;=> nil

我可以为其编写一些测试。
0
...