3

我想在 Clojure 中获得有界原语的位大小。这些可以找到

(java.lang.Integer/SIZE)
=>32

或同等的,不那么甜

(. java.lang.Integer SIZE)
=> 32

(我在这些示例中使用 java.lang.*-names 只是为了清楚起见,它们可以省略)

当然我想参数化调用,比如

(def integer-class java.lang.Integer)

(. integer-class SIZE)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: intger-class in this context, compiling:(/private/var/folders/yt/g82v06jn63qc5273rx4zjx440000gn/T/form-init4887476821027963248.clj:1:1) 

Java 中有界原语的数量是有限的,这使得这个练习有点学术,但问题是:

我如何(动态地)调用作为 var 给出的类中的静态方法?

4

1 回答 1

1

正如 ponzao 所说,Clojure vars 和 Java 静态方法有一个jcall解决问题的宏的答案。

(defmacro jcall [obj & args]
  (let [ref (if (and (symbol? obj) 
                  (instance? Class (eval obj)))
              (eval obj)
              obj) ]
    `(. ~ref ~@args)))

(jcall java.lang.Integer SIZE) => 32!

谢谢。

于 2014-01-02T14:31:13.970 回答