2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面了解有关此功能的一些更多信息。

0
Clojure

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

4 个答案

0

评论者:edtsech

测试通过。

0

评论者:jafingerhut

Edward,您的补丁用m1替换了表达式(或m1 {}),它在2008年10月16日的一个提交中被从m1更改为(或m1 {}),带注释文本“改进merge、merge-with中的nil处理”,因此我非常确定最好将其保留为(或m1 {})。我相信意图是允许merge-with的所有但一个map参数为nil,并且一切仍然可以正常工作。

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

如果它不使用第一个map调用,而是使用列表中的第一个非nil项调用,然后使用列表中的其余项,那么您的更改将更好地保留第一个非nil map上的任何元数据。

0
评论者:edtsech

我弄清楚`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
参考: https://clojure.atlassian.net/browse/CLJ-1128 (由edtsech报告)
...