将 java 个对象和方法调用转换为 Clojure 代码
Converting java object and method calls to Clojure codes
我专门想测试 Cjoures 声称它可以与 Java "seamlessly" 一起使用的说法。一般来说,如何翻译Java代码:
object1.object2(some_args).object3.object4(some_other_args).object5.objectnth.method(arg1, arg2, argn);
Clojure?链中的一些对象可能是静态 classes、静态方法或 class 变量,有些是接口。这似乎并不简单。例如,图形库中的对象。我记得有一次我试图创建一个对象 (Graphics.),但 Clojure 说它不知道 class Graphics.
非常感谢!
lisprog
让我们举一个 java 例子:
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,如果您仍然不明白,请告诉我们。
我专门想测试 Cjoures 声称它可以与 Java "seamlessly" 一起使用的说法。一般来说,如何翻译Java代码:
object1.object2(some_args).object3.object4(some_other_args).object5.objectnth.method(arg1, arg2, argn);
Clojure?链中的一些对象可能是静态 classes、静态方法或 class 变量,有些是接口。这似乎并不简单。例如,图形库中的对象。我记得有一次我试图创建一个对象 (Graphics.),但 Clojure 说它不知道 class Graphics.
非常感谢!
lisprog
让我们举一个 java 例子:
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,如果您仍然不明白,请告诉我们。