将java对象和方法调用转换为Clojure代码

时间:2016-08-18 19:30:33

标签: java object methods clojure translate

我特意试图测试Cjoures声称它可以“无缝地”使用Java。一般来说,如何翻译Java代码:

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

到Clojure?链中的一些对象可能是静态类,静态方法或类变量,有些是接口。它似乎并不简单。例如,图形库中的对象。我记得有一次我试图创建一个对象(Graphics。),而Clojure说它不知道那个类Graphics。

非常感谢!

lisprog

1 个答案:

答案 0 :(得分:2)

让我们举个例子:

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;
    }
}

并展示了一些访问内部对象的方法:

(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,如果您仍然没有得到什么,请告诉我们。