【问题标题】:Extending Clojure core protocols扩展 Clojure 核心协议
【发布时间】:2015-01-01 03:43:03
【问题描述】:

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

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

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

几个小时以来,我一直试图辨别什么协议定义了nth,但没有运气。是否有“本机”协议列表?我是不是完全搞混了?

【问题讨论】:

    标签: clojure


    【解决方案1】:

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

    但是,由于code 是开源的,您可以随时更改库本身。您需要做的就是在OrderedSetdeftype 中实现nthnthclojure.lang.Indexed 接口定义。

    【讨论】:

      【解决方案2】:

      作为Nathan Davis says,您不能“从外部”执行此操作,因为这些东西基于接口而不是协议。 OrderedSet 实现 Indexed 是很合理的;我一定是完全忽略了那个界面。

      另一方面,您对 nth 的实现效率非常低:您不想创建一个完整的长度为 N 的向量来查找其中的单个元素。相反,您想调用get,它的作用与nth 相同。


      编辑:再次回顾代码,我发现nth 并不容易正确实现,因为 disj 的存在使得很难快速判断有多少元素被从哪里掉下来了。我认为nth 的有效实现不会真正存在于这个数据结构中,除非您删除使用disj 的能力。所以我可能不会接受实现nth 的拉取请求,除非你发现了一些非常聪明的东西,但是如果你不需要disj 支持,请随时 fork ordered 并将其添加到你自己的 fork 中。

      【讨论】:

        猜你喜欢
        • 2011-12-21
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多