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

欢迎!有关如何工作的更多信息,请参阅关于页面。

0投票
Clojure

目前,Cycle、Range和Repeat并未实现索引功能,这意味着“nth”的平均操作时间是O(n)。

建议的更改是实现这些类的索引功能,使得“nth”操作变为O(1)。

6 答案

0投票

评论由:alexmiller

这是一个超出了这些函数以往所做功能的特性扩展和承诺。我们已经对它们做出了比真正想要的更多的承诺,所以我不确定我们是否还想添加更多的承诺。无论如何,我们不会在1.7版本中这样做。

提醒一下,你正在修补的Range现在并没有被用于任何地方——当前的实现使用core.clj中的分块序列定义。CLJ-1515(很可能)将用全新的实现取代Range类。无论如何,除非CLJ-1515得到解决,否则在这里修补Range可能不是很有用。

0投票

评论由:mikera

我明白了1.7。但我个人认为这个改变非常小,可以挤进去。让你决定。

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

0投票

评论由:alexmiller

当前没有任何这些函数保证返回索引化的结果。如果我们添加这一功能,并且人们开始依赖它,我们就无法通过修改实现来取消这一功能。所以我不确定我们是否希望做出这样的承诺。

0投票

评论由:mikera

我并不是建议我们承诺返回索引化的值,只是说这些类应该作为一个实现细节来实现接口(如果这样做有意义)。

这导致在像RT.nth这样的函数中采取快速路径,因此对于最常见的索引查找情况,我们得到O(1)而不是O(n)。

实际上,我认为“索引化”接口的主要目的是允许具体的数据类型以高效的方式参与到Clojure的索引访问函数中。

0投票

评论者:gshayban

人们通常会依赖实现细节,不论是承诺还是不承诺。如果Clojure添加了Indexed然后移除它,人们的代码可能会失效或者运行变慢。

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

0投票
参考:[https://clojure.atlassian.net/browse/CLJ-1690](https://clojure.atlassian.net/browse/CLJ-1690)(报告者:mikera)
...