评论者:alexmiller
我只是想说,这是我有记忆以来第一次查看这个工单,因为它几乎是在我参与 Clojure 核心的活动之前。我知道已经有很多年了,我正在真诚地思考这个问题。但我在重新走过你走过的路时可能会问一些愚蠢的问题。
我在确保良好的集合特性能被 Clojure 内部和外部 impls 使用这一点上绝对是一致的。
至于更改协议的可行性,我认为可能你误解了我的意图。我们当然可以更改或扩展协议,但我们只需要以扩展而不是破坏的方式来做(通过更改现有方法签名),即在保持现有内容不变的情况下进行扩展。我反对更改Sorted.seqFrom()的签名,因为它会破坏所有现有的实现——这根本无法开辟新局面。但将Sorted扩展到Sorted2(或更具意义的名称)并添加新的seqFrom参数是完全可行的。子序列代码然后可以在集合为Sorted2时执行最佳操作,如果仅为Sorted,则回退到其他操作。有各种方式来做到这一点,但希望你能理解意图——现有内容继续按原样工作,新内容如果可用,则加以利用。
退一步说,seqFrom和其相关功能似乎还不足以涵盖跨不同数据结构可能需要的所有功能。我一直认为NavigableSet有很多好的先前思考(不是说我有一个直接的答案,但它确实是在同一个问题区域),并且更广泛地查看在间隔年份中添加的其他数据结构,看看我们能实现什么,将会是划算的。
实际上,子序列的所有实现相当粗糙,依赖于许多运动部件和假设。也许整个子序列操作实际上应该交给集合直接执行。