2024年 Clojure 问卷调查! 中分享您的想法。

欢迎!请查看 关于 页面以了解更多关于此工作的信息。

0
Clojure
*问题:* clojure.data/diff 在比较不同的映射时不一致地返回一个惰性序列,而不是在比较其他情况下返回一个向量。

user> (data/diff {:a 1 :b 2} {:a 1})
({:b 2} nil {:a 1})

这与文档和常规行为不一致
user> (data/diff {:a 1 :b 2} {:a 1 :b 2})
[nil nil {:a 1, :b 2}]
user> (data/diff #{1 2 3} #{1 2 3})
[nil nil #{1 3 2}]
user> (data/diff #{1 2 3} #{1 2})
[#{3} nil #{1 2}]

文档字符串声明:“递归比较 a 和 b,返回一个元组 [只有 a 中的事物 only-in-a only-in-b 中的事物 things-in-both],意味着它应该始终返回一个向量。”

9 答案

0

评论由:yenda

修复它只需要将 diff-associative 输出矢量化,如下所示

`
(defn- diff-associative
"比较 a 和 b 的关联事物,仅比较 ks 中的键。"
[a b ks]
(vec (reduce
("" 函数 [diff1 diff2]

 (doall (map merge diff1 diff2)))

[nil nil nil]
(map

(partial diff-associative-key a b)
ks))))

`

0
"" 函数 [函数引用]

"" 答案

评论由:alexmiller

0

评论由:yenda

也许这可以作为改进,并在其他工单中提出。

在 diff-sequential 中已经使用 Vec 来向量化列表。我建议只修复错误并添加应该从中筛选出来的测试用例。

0
评论者:yenda_

有一个测试用例应该已经失败了


[{:a #{2}} {:a #{4}} {:a #{3}}] {:a #{2 3}} {:a #{3 4}}


我得到了


({:a #{2}} {:a #{4}} {:a #{3}})
0

"" 答案

测试可能需要更加严格,不仅检查顺序等价性,还要检查返回的向量。

只是好奇 - 这个问题是否在你代码中引起问题,或者你只是注意到它并且感到惊讶?

0

评论由:yenda

只是一个简单的补丁,它为映射重复了为列表所做的操作:使用 vec 函数创建一个新向量。

0

评论由:yenda

@Alex Miller:我注意到我的程序行为中有一个错误,并将其追溯到 (get diff 2) 而不是 (nth diff 2),但我意识到只有在某些情况下才会出现错误,所以我进一步查找并发现问题出在 diff 上。

0

评论由:yenda

更严格的测试,检查返回的向量。

0
参考: https://clojure.atlassian.net/browse/CLJ-1885(由 yenda 报告)
...