Clojure,Java Interop和代理方法

Nic*_*zyk 2 interop clojure

所以,假设我在Java中有一个名为MyFunction的抽象类,它有一个抽象的evaluate方法.

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

(def java-function
 (proxy [MyJavaFunction] []
   (evaluate [x]
     (* x 2))))
Run Code Online (Sandbox Code Playgroud)

然后调用它:

 (.evaluate java-function 3)
Run Code Online (Sandbox Code Playgroud)

回国

 ; => 6
Run Code Online (Sandbox Code Playgroud)

将上述内容变成更多的东西会有什么好方法:

  (java-function 3)
Run Code Online (Sandbox Code Playgroud)

那也会回来

 ; => 6
Run Code Online (Sandbox Code Playgroud)

Mic*_*zyk 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"
Run Code Online (Sandbox Code Playgroud)

要获得代理子类MyFunction和实现IFn,请在代理的第一个参数中提及它们; NB.班级第一:

(proxy [MyFunction clojure.lang.IFn] []
  ...)
Run Code Online (Sandbox Code Playgroud)

实际上上面的实现是不完整的 - 你还需要实现一个applyTo方法,它接受一个seq参数,this并使用它apply.invoke其他固定城市也有单独的方法(最多20个).按照此链接访问data.avl的源代码(版本0.0.12),以查看applyTo委托给适当invoke方法的实现,同时注意避免进入无限循环/如果传入的seq恰好是一个过多的时间无限/很长.