2016-08-18 6 views
1

私はCjouresの主張を「シームレスに」Javaで動作できるとテストしようとしていました。一般に、Javaコードをどのように翻訳しますか:Javaオブジェクトとメソッド呼び出しをClojureコードに変換する

object1.object2(some_args).object3.object4(some_other_args).object5.objectnth.method(arg‌​1, arg2, argn); 

to Clojure?チェーン内のオブジェクトの一部は、静的クラス、静的メソッド、またはクラス変数であり、一部はインターフェイスです。それは単純ではないようです。例えば、グラフィックライブラリ内のオブジェクト。私はある時点でオブジェクト(Graphics。)を作成しようとしましたが、Clojureはクラスグラフィックスを知らなかったと思います。

ありがとうございました!

public class Test { 

    public Test a; 

    public Test getA() { 
     return this.a; 
    } 

    public Test add(Test a) { 
     this.a = a; 
     return this; 
    } 

    public int foo(int a, int b, int c) { 
     return a+b+c; 
    } 

    public long foovar(Long... ai) { 
     long r = 0; 
     for (long i:ai) r+= i; 
     return r; 
    } 
} 

と内部オブジェクトにアクセスする方法の束を示しています:

+2

具体的な例がありますか?上記のサンプルは少し曖昧です。あなたは一例として、http://clojuredocs.org/clojure.core/dotoを見ることから始めることができます。また、http://clojure-doc.org/articles/language/interop.html –

+0

を参照してください "チェーン内のオブジェクトのいくつかは静的クラスかもしれません" [番号](http://stackoverflow.com/q/1215881/ 5044950) –

+0

@AlanThompson実際、この場合、['..'](https://clojuredocs.org/clojure.core/_ ..)が適しています。 –

答えて

1

は、Javaの例を取ることができます

lisprog

(import 'Test) 

;; create all the objects 
(def t1 (Test.)) 
(def t2 (Test.)) 
(def t3 (Test.)) 
(def t4 (Test.)) 
(def t5 (Test.)) 
(def t6 (Test.)) 

;; and lets chain them together: 
(.add t1 (.add t2 (.add t3 (.add t4 (.add t5 t6))))) 

;; verify using member access: 
(= t6 (.. t1 a a a a a)) ;; true 

;; verify using method call: 
(= t6 (.. t1 getA getA getA getA getA)) ;; true 

;; and mixed access 
(= t6 (.. t1 a a getA a a)) ;; true 

;; lets invoke foo: 
(.. t1 getA getA getA getA getA (foo 1 2 3)) ;; 6 

;; and invoke foovar: 
(.. t1 getA getA getA getA getA (foovar (into-array[1 2 3]))) ;; 6 

今、私たちはまた、ヘルパー関数を作成することができます

;; get the object at depth n using functions 
(defn get-nth-function [o n] 
    (first (drop n (iterate (memfn getA) o)))) 

;; get the object at depth n using member access. 
;; This same notation could also be used for function, 
;; however I just wanted to show an example of memfn 
(defn get-nth-member [o n] 
    (first (drop n (iterate #(.a %) o)))) 

;; lets verify: 
(= t6 (get-nth-member t1 5)) ;; true 

;; lets invoke foovar on object position 6, 
;; on a range of numbers from 1 to 10 
(.foovar (get-nth t1 5) (into-array (range 10))) ;; 45 

これは、clojureとjavaの間のやりとりの柔軟性を示すはずです。静的メンバーをお持ちの場合はSystem/outのように/でアクセスできます(ただし.でも動作します)。 http://clojure-doc.org/articles/language/interop.htmlを必ずお読みください。まだ何かが得られない場合は、私たちにご連絡ください。

+1

ありがとうございました!!!私を信じて;私はclojure公式サイトからjava-clojure interopを複数回読みました。私にRTFMを伝えるのではなく、知識を惜しみなく与えてくれたあなたのような人から何か答えを得ることができて大変です。再度、感謝します ! – lisprogtor

関連する問題