2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!有关如何使用本站的信息,请参阅 关于 页面。

0
ClojureScript

Clojure 的 sort 和 sort-by 都承诺 "保证稳定性:相同元素不会被重新排序。"。

ClojureScript 中的 sort 和 sort-by 的当前实现来自

9ee4dbf63d3968b70f29708aa03aace98cdcb624 作者:Stuart Halloway <[email protected]> 作者日期:2011年7月14日星期四 12:18:34 -0500

`
(defn sort
"返回 coll 中项目的排序序列。Comp 可以是
布尔值的比较函数,也可以是 -/0/+ 值的比较器。
comp 默认为 compare。
([coll]
(sort compare coll))
([comp coll]
(if (seq coll)

 (let [a (to-array coll)]
   ;; matching Clojure's stable sort, though docs don't promise it
   (garray/stableSort a (fn->comparator comp))
   (seq a))
 ())))

(defn sort-by
"返回 coll 中项目的排序序列,其中排序
的顺序由比较 (keyfn item) 确定。Comp 可以是
布尔值的比较函数,也可以是 -/0/+ 值的比较器。
comp 默认为 compare。
([keyfn coll]
(sort-by keyfn compare coll))
([keyfn comp coll]

 (sort (fn [x y] ((fn->comparator comp) (keyfn x) (keyfn y))) coll)))

`

鉴于此实现似乎已经调用 google 的 stableSort 过去 8 年时间,或许文档字符串可以修改以反映这一点。

参考,google closure array 文档:(链接:https://google.github.io/closure-library/api/goog.array.html

注意,stableSort 的文档字符串实际上没有提到稳定性,但排序函数包含 "此排序不保证稳定性。"。

5 答案

0

评论者:seancorfield

(从 Slack 上的讨论中,我提出了一些建议,有人建议我把这个建议添加到这个票据中)

我认为最好明确指出

Guaranteed to be stable: equal elements will not be reordered.

Not guaranteed to be stable.

这样,开发人员将 知道 他们是 可以 依赖于稳定性,还是 不应该 依赖于它(即使当前实现碰巧是稳定的)。

0

评论人:pbwolf

Clojure的sort文档字符串说明:“保证稳定性:相等的元素不会被重新排序。”之前虽然已经稳定但并未详细文档记录。请参阅https://dev.clojure.org/jira/browse/CLJ-1414

我希望CLJS会在(a)以相同的方式保持稳定,并且(b)符合Clojure对稳定性的文档说明。

0

评论人:saurabh

如果该问题仍未关闭,我想着手解决它

0

评论人:dnolen

尝试一下吧,你提交了CA(贡献者申请)吗?

0
参考: https://clojure.atlassian.net/browse/CLJS-3035(由dpsutton报告)
...