2010-12-10 67 views
10

Quelle est la syntaxe pour créer un tableau d'octets dans Clojure initialisé à une collection de valeurs spécifiée?Comment initialiser un tableau d'octets dans Clojure

Quelque chose de ce genre, mais qui fonctionne ...

(byte-array [0 1 2 3])

+1

votre travail échantillon ** ** ne dans les versions ultérieures de Clojure (testé dans 1,8). Je ne sais pas quand ça a changé. –

Répondre

12

(byte-réseau (octet de la carte [0 1 2 3])

afaik Clojure n'a pas d'octets littéraux.

+0

Correct; à partir de Clojure 1.5, il n'a pas de littéral octet: http://clojure.org/reader –

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

Explication:

byte crée un byte

byte-array crée un byte[]

bytes convertit byte[]

+1

byte-array crée octet [], donc l'appel à bytes n'est pas nécessaire. –

+0

Vous avez raison. Repl automatiquement les primitives de boxe m'a confus. Corrigé –

+0

En fait, 'byte' coerces à' byte', bien que dans 1.2 tous les arguments aux fonctions soient autoboxed, donc 'byte-array' reçoit toujours' Byte'-s et doit les déballer. Essayez '(boucle [i (octet 0)] (récurrence (octet 0)))' à un REPL 1.2 pour vérifier cela. –

4

D'autres affiches ont étant donné de bonnes réponses qui fonctionnent bien.

Ceci est juste au cas où vous faites cela beaucoup et veulent une macro pour rendre votre syntaxe un peu plus net:

(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

Une fonction fonctionnerait tout aussi bien, non? Cette réponse brise la [première règle du Macro Club] (https://clojurefun.wordpress.com/2013/01/09/when-do-you-need-macros-in-clojure/): N'écrivez pas de macros! –