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

欢迎!请参阅关于页面以了解此网站的更多信息。

0
Clojure

目前,Cycle、Range 和 Repeat 没有实现 Indexed,这意味着 "nth" 的平均时间复杂度为 O(n)。

建议的更改是实现这些类别的 Indexed,使得 "nth" 变为 O(1) 操作。

6 答案

0

评论来自:alexmiller

这超出了这些函数过去所做的能力范围和承诺。我们在它们身上已经投入的比我们真正想要的要多,所以我真不确定我们是否还愿意增加更多承诺。无论如何,我们不会在 1.7 中做这件事。

仅供参考,您正在修补的范围当前没有用于任何东西——当前实现使用 core.clj 中的分块 seq 定义。CLJ-1515(很可能)将用全新的实现替换 Range 类。无论如何,直到 CLJ-1515 被解决,修补范围在这里可能没有意义。

0

评论来自:mikera

关于 1.7,我明白。尽管我个人认为这足够小,你应该能挤进去。由你决定。

然而,我仍然认为这种方法是有用的:nth 是一个非常常见的操作,我注意到您在 CLJ-1515 中还没有对其基准测试。无论使用什么新的 Range 实现,都将受益于实现 Indexed。

0

评论来自:alexmiller

目前没有任何这些函数承诺返回可检索的索引值。如果我们加上这个功能并且人们开始依赖它,我们就无法以移除它的方式改变实现。所以我不确定这是不是我们想要做出的承诺。

0

评论来自:mikera

我不是建议我们承诺任何可检索返回值,而只是说,这些类将实现接口作为实现细节(当这样做有意义时)。

这将为类似RT.nth的函数中的快速路径导致,以便我们在最常用的索引查找情况下获得O(1)而不是O(n)。

老实说,我的假设是,这是“Indexed”接口的主要目的,即允许具体的集合类型以高效的方式参与Clojure的索引访问函数。

0

评论者:gshayban

人们经常会依赖实现细节,不管是否承诺。如果Clojure添加了Indexed然后又移除了它,人们的代码可能会被破坏或变慢。

实现行为(无论是有意的还是隐式的)必然被视为未来的约束(锁链),因此必须仔细考虑。

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