警告:我几乎可以确定我使用了至少一些相关术语
我想修改flatland.ordered.set.OrderedSet,使得nth
函数可用。我认为这涉及到以下内容:
(extend-type flatland.ordered.set.OrderedSet
?????
(nth [this n] (nth (vec this) n))
我已经尝试了几个小时来确定协议定义中的nth
,但没有成功。是否有一个“本地”协议列表?还是我完全弄混了?
警告:我几乎可以确定我使用了至少一些相关术语
我想修改flatland.ordered.set.OrderedSet,使得nth
函数可用。我认为这涉及到以下内容:
(extend-type flatland.ordered.set.OrderedSet
?????
(nth [this n] (nth (vec this) n))
我已经尝试了几个小时来确定协议定义中的nth
,但没有成功。是否有一个“本地”协议列表?还是我完全弄混了?
extend-type
是不可能实现您想要的功能的。Clojure的持久化集合接口是使用Java接口实现的,而不是Clojure协议。因此,无法使用extend-type
进行扩展。但是,由于代码是开源的,所以您始终可以更改库本身。您只需要在OrderedSet
的deftype
中实现nth
即可。 nth
由clojure.lang.Indexed
接口定义。正如Nathan Davis所说,你无法从外部实现这个功能,因为这些都是基于接口而不是协议的。OrderedSet实现Indexed是非常合理的;我可能完全忽视了这个接口。
另一方面,你的nth实现效率非常低下:你不想创建一个长度为N的向量来查找单个元素。相反,你需要调用get
,它与nth
执行相同的操作。
nth
的正确实现并不容易,因为disj
的存在使得很难快速地确定从哪里删除了多少元素。我认为,除非您删除使用disj
的能力,否则无法为此数据结构提供有效的nth
实现。因此,除非您想出一些真正聪明的方法,否则我可能不会接受实现nth
的拉取请求,但如果您不需要disj
支持,可以随意分叉ordered
并将其添加到自己的分叉中。