Java 为什么可以';扩展Clojure';s IFn使用扩展类型?

Java 为什么可以';扩展Clojure';s IFn使用扩展类型?,java,clojure,clojurescript,Java,Clojure,Clojurescript,我看过David Nolen在ClojureScript上的演讲,他将IFn扩展到Regexp,这样我们就可以调用regex文本作为字符串上的一个函数来检查匹配 我在常规Clojure中尝试了类似的字符串,但我得到了这个例外。 我看到IFn是一个用Java编写的接口,但是在CLojrue前端如何实现呢 (extend-type java.lang.String #_=> clojure.lang.IFn #_=> (-invoke #_=> ([th

我看过David Nolen在ClojureScript上的演讲,他将IFn扩展到Regexp,这样我们就可以调用regex文本作为字符串上的一个函数来检查匹配

我在常规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)

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

在这种情况下,我最好的选择是一种新类型,它只包装一个java.lang.String,并将所有调用传递给它,除了-invoke并实现IFn?但是在
clojure
中,关键字的行为可以类似于函数,例如
(:a{:a 36})
。它是如何工作的?关键字是用Java实现的,因此它们可以从IFn接口继承,那么,似乎有两个问题?1) IFn不是一个协议。2) 不能扩展Java类。