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

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

0
Clojure

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

提议的更改是实现这些类的 Indexed,使 "nth" 成为一个 O(1) 操作。

6 个答案

0

评论由:alexmiller 提出

这是对这些函数过去所做功能和承诺的扩展和承诺。我们已经为他们许下了比我们真正想要的更多的承诺,所以我确信我们不想再增加更多承诺。无论如何,我们不会对 1.7 做这件事情。

顺便说一句,你现在补丁的 Range 目前实际上没有任何用途——当前的实现在 core.clj 中使用了一个分块序列定义。CLJ-1515 将(可能是)用全新的实现来替换 Range 类。无论如何,在这里修复 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 提供)
...