请在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中存在的内容 仅在b中存在的内容 两者都存在的内容]的元组",这意味着它总是应该返回一个向量。

9个答案

0

评论由:yenda提出

修复它只需要将diff-associative输出vector化,如下

`
(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提出

还有其他可能的解决方案,例如使用transducers。不确定这样做是否值得,但在我们进行更改时考虑这一点似乎是合理的。

0

评论由:yenda提出

这或许可以作为一项改进并提交在其他任务中。

在diff-sequential中已经使用了Vec来向量化列表。我建议只需修复bug并添加应该检验它的测试用例。

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:我注意到我的程序行为中存在一个bug,并且追踪到(get diff 2)而不是(nth diff 2),但我意识到只是在某些情况下有bug,所以我进一步检查,发现这来自diff。

0

评论由:yenda提出

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

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