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` 已经给我传了一个列表的头部 head。 :) (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 报告)
...