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 に答える