扩展Clojure核心协议

时间:2015-01-01 03:43:03

标签: clojure

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

我想修改flatland.ordered.set.OrderedSet以便nth有效。我认为这涉及到:

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

我一直在努力辨别协议定义nth几个小时,没有运气。是否有“本机”协议列表?我刚刚完全混淆了吗?

2 个答案:

答案 0 :(得分:2)

目前无法使用extend-type执行您想要执行的操作。 Clojure的持久收集接口是使用Java接口而不是Clojure协议实现的。因此,无法使用extend-type扩展它们。

但是,由于code是开源的,因此您可以随时更改库本身。您需要做的就是在nth OrderedSet中实施deftypenthclojure.lang.Indexed界面定义。

答案 1 :(得分:2)

正如内森戴维斯所说,你不能“从外面”这样做,因为这些东西是基于接口而不是协议。 OrderedSet实现Indexed是合理的;我一定是完全忽略了这个界面。

另一方面,你对nth的实现是非常低效的:你不想创建一个整个长度为N的向量,只是为了查找其中的单个元素。相反,您想要调用get,它与nth做同样的事情。


编辑:重新审视代码后,我发现nth并不是那么容易正确实现,因为disj的存在使得很难快速判断出有多少元素已从集合中删除。除非您删除使用nth的功能,否则我认为此数据结构不能真正存在disj的有效实现。所以我可能不会接受实现nth的拉取请求,除非你弄清楚一些非常聪明的东西,但是如果你不需要{{1},可以随意分叉ordered并将它添加到你自己的分支中。支持。