Clojure,Java Interop和代理方法

时间:2014-09-02 09:05:55

标签: clojure interop

所以,让我们说我在Java中有一个名为MyFunction的抽象类,它有一个抽象的求值方法。

要在clojure中使用它,我可以这样做:

(def java-function
 (proxy [MyJavaFunction] []
   (evaluate [x]
     (* x 2))))

然后用:

来调用它
 (.evaluate java-function 3)

返回

 ; => 6

将上述内容转变为更具特色的东西会有什么好方法:

  (java-function 3)

也将返回

 ; => 6

1 个答案:

答案 0 :(得分:5)

您可以通过实施clojure.lang.IFn界面来实现这一目标:

((proxy [clojure.lang.IFn] []
  (invoke [x]
    (str "A very a nice x indeed: " x)))
 3)
;= "A very a nice x indeed: 3"

要拥有代理子类MyFunction并实现IFn,请在代理的第一个参数中提及它们; NB。上课第一:

(proxy [MyFunction clojure.lang.IFn] []
  ...)

实际上上述实现并不完整 - 您还希望实现applyTo方法,该方法除了this之外还使用单个seq参数并由apply使用。对于其他固定的arities(最多20个),也有单独的invoke方法。关注this link到data.avl的来源(版本0.0.12)以查看委派给相应applyTo方法的invoke实现,同时注意避免进入无限循环/如果传入的seq恰好是无限/非常长,则会花费过多的时间。