2012-10-28 8 views
12

Utilizzando lein repl con Clojure 1.4.0, posso definire un ^:const di un array di byte Java, ma non posso poi fare qualsiasi cosa con esso:Perché non posso usare Clojure:^const con un array di byte 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) 

Ho confermato questo accade nella mia app pure , quindi non è solo un problema REPL.

Cosa mi manca?

risposta

11

^: le forme const vengono valutate in fase di compilazione, ma in clojure, i valori di compilazione devono essere stampabili e leggibili (dal lettore clojure) *. Come la maggior parte degli oggetti java, gli array di byte non sono stampabili o leggibili, quindi non puoi renderne costante una costante.

Inoltre, secondo i documenti, ^: const è utile solo per i primitivi. matrici non primitive.

+0

Grazie Joost, è molto istruttivo! –

+0

Provengo da uno sfondo non Java, e stamattina ho passato un po 'a rincorrere questo problema, dove il mio valore era un file java.io.File. Questa domanda e risposta sono state utili per cogliere il "perché" che ho capito cosa stava succedendo. –

Problemi correlati