2010-12-10 3 views
10

지정된 값 컬렉션으로 초기화 된 Clojure에서 바이트 배열을 만드는 구문은 무엇입니까?Clojure에서 바이트 배열을 초기화하는 방법

뭔가 같이 있지만 작동 ...

(바이트 배열 [0 1 2 3)

+1

샘플 ** ** Clojure의 이후 버전의 작업이 (1.8에서 테스트 않습니다

이는 경우에 당신은 약간 정돈하여 구문을 확인하기 위해 매크로를이 많은 일을하고 싶다고한다). 그것이 언제 바뀌 었는지 모르겠습니다. –

답변

12

(바이트 배열 (MAP 바이트 [0 1 2 3))

afaik Clojure에는 바이트 리터럴이 없습니다.

+0

올바른; Clojure 1.5에서는 바이트 리터럴이 없습니다. http://clojure.org/reader –

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

는 설명 :

bytebyte

byte-arraybyte[]

bytesbyte[]

+1

바이트 배열은 바이트 []를 생성하므로 바이트 호출은 필요하지 않습니다. –

+0

당신 말이 맞아요. repl 자동으로 boxing primitives가 나를 혼란스럽게 만들었습니다. Corrected –

+0

사실,'byte'는 1.2로 함수에 대한 모든 인자가 autoboxed이기 때문에'byte'를 강제합니다. 그래서'byte-array'는 여전히'Byte'-s를 받고 그것들을 unbox 할 필요가 있습니다. 이것을 확인하기 위해 1.2 REPL에서'(loop [i (byte 0)] (recur (Byte. 0)))'을 시도해보십시오. –

4

다른 포스터 한로 변환 생성 생성 좋은 응답이 주어지면 잘 작동합니다.

(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

함수도 올바르게 작동합니다. 맞습니까? 이 대답은 [매크로 클럽의 첫 번째 규칙]을 깨뜨린 것입니다 (https://clojurefun.wordpress.com/2013/01/09/when-do-you-need-macros-in-clojure/) : 매크로를 작성하지 마십시오! –

관련 문제