Подтвердить что ты не робот

Почему я не могу использовать Clojure: ^ const с массивом байтов Java?

Используя lein repl с Clojure 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: [[email protected], compiling:(NO_SOURCE_PATH:1)
user=> (type cx)
CompilerException java.lang.RuntimeException: Can't embed object in code, maybe print-dup not defined: [[email protected], compiling:(NO_SOURCE_PATH:1) 

Я подтвердил, что это происходит и в моем приложении, так что это не просто проблема REPL.

Что мне не хватает?

4b9b3361

Ответ 1

^: const-формы вычисляются во время компиляции, но в clojure значения времени компиляции должны быть доступны для печати и чтения (читателем clojure) *. Как и большинство объектов java, байт-массивы не могут быть распечатываемыми или читаемыми, поэтому вы не можете сделать из них константу.

Кроме того, согласно документам, ^: const полезен только для примитивов. а не примитивные массивы.