13

lein replClojure 1.4.0を使用する^:constと、Java バイト配列の を定義できますが、その後は何もできません。

user=> (def x (byte-array (map byte [0 1 2 3])))
#'user/x
user=> (alength x)
4
user=> (type x)
[B
user=> (def ^:const cx (byte-array (map byte [0 1 2 3])))
#'user/cx
user=> (alength cx)
CompilerException java.lang.RuntimeException: Can't embed object in code, maybe print-dup not defined: [B@10e6cbd, compiling:(NO_SOURCE_PATH:1)
user=> (type cx)
CompilerException java.lang.RuntimeException: Can't embed object in code, maybe print-dup not defined: [B@10e6cbd, compiling:(NO_SOURCE_PATH:1) 

これは私のアプリでも発生することを確認したので、REPL だけの問題ではありません。

私は何が欠けていますか?

4

1 に答える 1

13

^:const フォームはコンパイル時に評価されますが、clojure では、コンパイル時の値は (clojure リーダーによって) 印刷可能で読み取り可能でなければなりません*。ほとんどの Java オブジェクトと同様に、バイト配列は印刷も読み取りもできないため、それらから定数を作成することはできません。

また、ドキュメントによると、 ^:const はプリミティブにのみ役立ちます。プリミティブ配列ではありません。

于 2012-10-28T17:34:48.733 に答える