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输出转换为向量,如下所示

`
(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 来向量化列表。我建议仅修复这个错误并添加应该覆盖这个情况的测试用例。

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),但我意识到它仅在某些情况下有错误,所以我进一步查找发现了问题来自于 diff。

0投票

评论者:yenda

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

0投票
参考: https://clojure.atlassian.net/browse/CLJ-1885(由yenda提交的)
...