扩展Clojure核心协议

4

警告:我几乎可以确定我使用了至少一些相关术语

我想修改flatland.ordered.set.OrderedSet,使得nth函数可用。我认为这涉及到以下内容:

(extend-type flatland.ordered.set.OrderedSet
    ?????
    (nth [this n] (nth (vec this) n))

我已经尝试了几个小时来确定协议定义中的nth,但没有成功。是否有一个“本地”协议列表?还是我完全弄混了?

2个回答

3
目前使用extend-type是不可能实现您想要的功能的。Clojure的持久化集合接口是使用Java接口实现的,而不是Clojure协议。因此,无法使用extend-type进行扩展。但是,由于代码是开源的,所以您始终可以更改库本身。您只需要在OrderedSetdeftype中实现nth即可。 nthclojure.lang.Indexed接口定义。

3

正如Nathan Davis所说,你无法从外部实现这个功能,因为这些都是基于接口而不是协议的。OrderedSet实现Indexed是非常合理的;我可能完全忽视了这个接口。

另一方面,你的nth实现效率非常低下:你不想创建一个长度为N的向量来查找单个元素。相反,你需要调用get,它与nth执行相同的操作。


编辑:再次查看代码后,我发现nth的正确实现并不容易,因为disj的存在使得很难快速地确定从哪里删除了多少元素。我认为,除非您删除使用disj的能力,否则无法为此数据结构提供有效的nth实现。因此,除非您想出一些真正聪明的方法,否则我可能不会接受实现nth的拉取请求,但如果您不需要disj支持,可以随意分叉ordered并将其添加到自己的分叉中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接