2013-12-11 5 views
7

私はオブジェクトに対してメソッドを持っています。ClojureでJavaメソッドの呼び出しを部分的にすることはできますか?

myObject.myMethod(1) 

私はClojureの

でこれを呼び出すことができ
(.myMethod myObject 1) 

私もレキシカル環境

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

からの情報を使用して、それを呼び出すことができますが、私はこれは部分的に行うことができますか?例えば。私は現在、匿名関数でこの作品を作ってるんだ、この文脈で.myMethod

:シンボルを解決できません:

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

これは私

java.lang.RuntimeExceptionを与えます

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

ただし、この場合は部分的に使用するとよいでしょう。出来ますか?

私は答えがバインディングとディスパッチに関係すると確信していますが、コンパイルと実行中のどこでディスパッチが起こったのかがまだわかりません。

答えて

10

あなたのケースには、(memfn)を使用してください。 REPLで

(memfn myMethod args) 

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. 
+0

そのことを聞いたことがありません。ありがとう! – xsc

+0

ありがとう@Chiron! – Joe