【问题标题】:Why can't I extend Clojure's IFn using extend-type?为什么我不能使用扩展类型扩展 Clojure 的 IFn?
【发布时间】:2014-07-26 20:10:08
【问题描述】:

我看到了 David Nolen 在 ClojureScript 上的演讲,他在其中将 IFn 扩展为 Regexp,这样我们就可以调用正则表达式文字作为字符串上的函数来检查匹配项。

我在常规 Clojure 中尝试了类似的字符串,但我得到了这个异常。 我看到 IFn 是一个用 Java 编写的接口,但是在 CLojrue 前端的实现是如何工作的。

(extend-type java.lang.String
  #_=>    clojure.lang.IFn
  #_=>   (-invoke
  #_=>    ([this index]
  #_=>     (get (seq this) index))))
IllegalArgumentException interface clojure.lang.IFn is not a protocol  clojure.core/extend (core_deftype.clj:742)

【问题讨论】:

    标签: java clojure clojurescript


    【解决方案1】:

    异常应该给你一个提示。 IFn 不是 Clojure 中的协议。它在 ClojureScript 中。您可以extend 协议、实现Java 接口和子类。在这种特殊情况下,您甚至不能继承 java.lang.String,因为它被声明为 final。

    【讨论】:

    • 在这种情况下,我最好的选择是一个新类型,它只包装一个 java.lang.String 并将所有调用传递给它,除了 -invoke 并实现 IFn ?
    • 但是在clojure 中,关键字可以表现得像函数,例如(:a {:a 36})。它是如何工作的?
    • 关键字是Java实现的,所以可以继承IFn接口github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/…
    • 看来,有两个问题? 1) IFn 不是协议。 2) 你不能扩展 Java 类。
    猜你喜欢
    • 2015-03-09
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    相关资源
    最近更新 更多