警告:我几乎可以肯定我至少使用了一些错误的相关术语
我想修改flatland.ordered.set.OrderedSet以便nth
有效。我认为这涉及到:
(extend-type flatland.ordered.set.OrderedSet
?????
(nth [this n] (nth (vec this) n))
我一直在努力辨别协议定义nth
几个小时,没有运气。是否有“本机”协议列表?我刚刚完全混淆了吗?
答案 0 :(得分:2)
目前无法使用extend-type
执行您想要执行的操作。 Clojure的持久收集接口是使用Java接口而不是Clojure协议实现的。因此,无法使用extend-type
扩展它们。
但是,由于code是开源的,因此您可以随时更改库本身。您需要做的就是在nth
OrderedSet
中实施deftype
。 nth
由clojure.lang.Indexed
界面定义。
答案 1 :(得分:2)
正如内森戴维斯所说,你不能“从外面”这样做,因为这些东西是基于接口而不是协议。 OrderedSet实现Indexed是合理的;我一定是完全忽略了这个界面。
另一方面,你对nth的实现是非常低效的:你不想创建一个整个长度为N的向量,只是为了查找其中的单个元素。相反,您想要调用get
,它与nth
做同样的事情。
编辑:重新审视代码后,我发现nth
并不是那么容易正确实现,因为disj的存在使得很难快速判断出有多少元素已从集合中删除。除非您删除使用nth
的功能,否则我认为此数据结构不能真正存在disj
的有效实现。所以我可能不会接受实现nth
的拉取请求,除非你弄清楚一些非常聪明的东西,但是如果你不需要{{1},可以随意分叉ordered
并将它添加到你自己的分支中。支持。