11

我有一个对象的方法。

myObject.myMethod(1)

我可以在 Clojure 中调用它

(.myMethod myObject 1)

我也可以使用来自词汇环境的信息来调用它

(let [x 1] (.myMethod myObject x))

我可以用部分来做到这一点吗?例如

(let [myPartial (partial .myMethod myObject)]
      (myPartial 1))

这给了我一个

java.lang.RuntimeException:无法解析符号:.myMethod 在此上下文中

我目前正在使用匿名函数进行这项工作

(let [myThing #(.myMethod myObject %)]
      (myThing 1))

但是如果在这种情况下使用部分会很好。是否可以?

我确信答案将与绑定和调度有关,但我还不知道在编译和执行期间调度发生在哪里。

4

1 回答 1

11

在您的情况下,您可以使用(memfn)。

(memfn myMethod args)

在 REPL 中:

user=> (doc memfn)
-------------------------
clojure.core/memfn
([name & args])
Macro
Expands into code that creates a fn that expects to be passed an
object and any args and calls the named instance method on the
object passing the args. Use when you want to treat a Java method as
a first-class fn. name may be type-hinted with the method receiver's
type in order to avoid reflective calls.
于 2013-12-11T13:40:31.720 回答