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

欢迎!请查看关于页面以获取更多关于该功能的信息。

0
Clojure

为reduce设置第一个映射作为初始值
以避免在第一个映射上调用merge-entry(一连串的contains?调用等)。

4个答案

0

评论者:edtsech

测试通过。

0

评论者:jafingerhut

Edward,你的补丁用m1代替了(or m1 {})。它已在2008年10月16日的一个提交中从m1改为(or m1 {}),描述文本为“改进了merge, merge-with中的nil处理”,所以我认为最好将其保留为(or m1 {})。我认为意图是允许merge-with的多数映射参数为nil,同时一切仍然可以正常工作。

避免一个merge调用其余的补丁看起来对我来说是合理的。

如果用列表的第一个非nil项而不是首先的映射调用它,用第一非nil映射后的剩余列表调用它,那么您的更改将更好地保留第一非nil映射中的任何元数据。

0
_评论者:edtsech_

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

我不确定关于`(or m1 {})`。我没有看到会发生什么问题。可能自2008年以来,使用的内部函数的行为已经发生了变化。

(包含 nil: a);=> false
(关联 nil :a 1);=> {:a 1}
(获取 nil :a);=> nil

我可以为它编写一些测试。
0
参考:https://clojure.atlassian.net/browse/CLJ-1128(由 edtsech 报告)
...