2010-12-10 11 views
10

¿Cuál es la sintaxis para crear una matriz de bytes en Clojure inicializada en una colección de valores especificada?Cómo inicializar una matriz de bytes en Clojure

Algo como esto, pero eso funciona ...

(byte-array [0 1 2 3])

+1

su muestra ** ** no funcionaban en versiones posteriores de clojure (probado en 1.8) No estoy seguro cuando cambió –

Respuesta

12

(matriz de bytes (mapa byte [0 1 2 3]))

afaik Clojure no tiene literales de byte.

+0

Correcto; a partir de Clojure 1.5, no tiene un byte literal: http://clojure.org/reader –

1
(byte-array [(byte 0x00) (byte 0x01) (byte 0x02) (byte 0x03)]) 
1
(byte-array [(byte 0) (byte 1) (byte 2)]) 

Explicación:

byte crea una byte

byte-array crea una byte[]

bytes convierte en byte[]

+1

byte-array crea byte [], por lo que la llamada a bytes no es necesaria. –

+0

Tienes razón. Repl automáticamente las primitivas del boxeo me confundieron. Corregido –

+0

De hecho, 'byte' coacciona a' byte', aunque en 1.2 todos los argumentos a las funciones son autoboxados, por lo que 'byte-array' aún recibe' Byte'-s y necesita destrabarlos. Intenta '(loop [i (byte 0)] (recurre (Byte. 0)))' en un 1.2 REPL para verificar esto. –

4

otros críticos han da buenas respuestas que funcionan bien.

Esto es en caso de que lo están haciendo esto mucho y quieren una macro para hacer su sintaxis un poco más ordenado:

(defmacro make-byte-array [bytes] 
    `(byte-array [[email protected](map (fn[v] (list `byte v)) bytes)])) 

(aget (make-byte-array [1 2 3]) 2) 
=> 3 
+2

Una función funcionaría igual de bien, ¿verdad? Esta respuesta rompe la [primera regla de Macro Club] (https://clojurefun.wordpress.com/2013/01/09/when-do-you-need-macros-in-clojure/): ¡No escriba macros! –

Cuestiones relacionadas