13

使用lein replClojure 1.4.0,我可以定义一个^:constJava 字节数组,但我不能用它做任何事情:

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 回答