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

欢迎!请参阅 关于页面 了解相关信息。

0
Clojure

为 reduce 设置一个初始值为第一个 map
以避免在第一个 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
...