2012-10-28 13 views
12

Korzystanie lein repl z Clojure 1.4.0, mogę zdefiniować ^:const z bajt tablicy Javy, ale nie mogę wtedy zrobić coś z nim:Dlaczego nie mogę używać Clojure's:^const z tablicą Javy?

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) 

Ustaliliśmy, to dzieje się w mojej aplikacji, jak również , więc nie jest to tylko kwestia REPL.

Czego mi brakuje?

Odpowiedz

11

^: formularze const są analizowane w czasie kompilacji, ale w clojure wartości kompilacji muszą być drukowane i czytelne (przez czytnik clojure) *. Podobnie jak większość obiektów java, tablice bajtów nie są drukowane ani czytelne, więc nie można ich stamtąd wydobywać.

Ponadto, zgodnie z dokumentami, ^: const jest użyteczne tylko dla prymitywów. nie prymitywne tablice.

+0

Dzięki Joost, to bardzo pouczające! –

+0

Pochodzę z tła innego niż Java, a dziś rano spędziłem chwilę ścigając ten problem, gdzie moja wartość to plik java.io.File. To pytanie i odpowiedź były pomocne w uchwyceniu "dlaczego", uświadomiłem sobie, co się dzieje. –

Powiązane problemy