2024年Clojure调查问卷!中分享您的观点。

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

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

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

This与文档和正常行为不一致
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中的项 只存在于b中的项 同时存在于a和b中的项]",暗示它应该始终返回一个向量。

9 答案

0

评论者:yenda

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

`
(defn- diff-associative
"比较键ks中的a和b中的关联项。"
[a b ks]
(vec (reduce
(fn [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

评论者:alexmiller

可能需要使测试更加严格,检查的不仅是序列相等,还要检查返回的向量。

只是好奇——这个问题是否在你的代码中引起了问题,或者你只是发现了它并且感到惊讶?

0

评论者:yenda

一个简单的补丁,只是对映射做列表所做的事情:用vec函数创建一个新的向量。

0

评论者:yenda

@Alex Miller:我发现我的程序行为中有一个错误,并追踪到(get diff 2)而不是(nth diff 2),但后来我发现它只在不者些情况下有错误,于是我又进一步查找,发现problem来源于diff。

0

评论者:yenda

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

0
...