为什么我不能使用Clojure:^ const与Java字节数组?

时间:2012-10-28 15:05:07

标签: clojure

在Clojure 1.4.0中使用lein repl,我可以定义一个Java字节数组的^:const,但我不能对它做任何事情:

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问题。

我错过了什么?

1 个答案:

答案 0 :(得分:11)

^:const表单在编译时进行评估,但在clojure中,编译时值必须是可打印和可读的(由clojure reader)*。与大多数java对象一样,字节数组不可打印或可读,因此您无法使用它们来保持常量。

另外,根据文档,^:const仅对基元有用。不是原始数组。