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

欢迎!请参阅 关于 页面了解该功能的工作方式。

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)。

坦白说,我之前的假设是这是“已索引”接口的主要目的,即允许具体的收集类型以高效的方式参与 Clojure 的索引访问函数。

0

评论作者:gshayban

人们经常依赖于实现细节,无论是否有承诺。如果 Clojure 添加了 Indexed 并删除它,人们的内容会出问题或变慢。

实现行为(无论是显式的还是隐式的)必然被视为未来的约束(束缚),因此需要仔细考虑。

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