2011-09-15 3 views
10

Clojure의 :Clojure의 시퀀스와 일치하지 않습니까?

1:13 user=> (first (conj '(1 2 3) 4)) 
4 
1:14 user=> (first (conj [1 2 3] 4)) 
1 
; . . . 
1:17 user=> (first (conj (seq [1 2 3]) 4)) 
4 

내가 무슨 일이 일어나고 있는지 이해하지만,이 작품은 다르게해야?

+0

나는 올해 5 월부터 Clojure를 배웠다. Clojure 이전에 Lisp과 비슷한 언어를 배운 적이 없기 때문에 이처럼 연습 문제를 매우 유용하게 생각했습니다. – octopusgrabbus

답변

20

문서 :

접속사 [OIN]. xs 'added'가 포함 된 새 모음을 반환합니다. (conj nil item)은 (item)을 반환합니다. '추가'는 구체적인 유형에 따라 이 다른 '장소'에서 발생할 수 있습니다.

벡터 끝 부분에 요소를 추가하는 것이 더 효율적이지만 목록 시작 부분에서는 요소를 추가하는 것이 더 효율적입니다. conj은 데이터 구조에 가장 효율적인 것을 사용합니다. 당신이주는 예, '(1 2 3)(seq [1 2 3])에서

모두 ISeq (documentation for seq? 참조), [1 2 3]하지 않는 동안 구현합니다.

Clojure의 conj은 궁극적으로 기본 데이터 구조에서 cons 메서드 (cons 함수와 혼동하지 말아야합니다.이 메서드는 내부 클래스 코드입니다)를 호출합니다. 벡터 (PersistentVector)의 경우 cons은 끝에 요소를 추가하고 목록은 앞에 추가합니다 (PersistentListcons 메서드는 새 요소를 머리로, 기존 목록을 꼬리로 사용하여 새 목록을 반환 함) .

+0

예를 들어,'(cons 4 [1 2 3])'는 요소를 추가하지 않고 앞에 붙이면 결과가'(4 ​​1 2 3)이됩니다.)'. 나머지 대답은 절대적으로 옳습니다. –

+0

당신은 맞습니다, Zach, Clojure의'cons' 함수 ('Clojure.lang.RT/cons'에서 구현)는 PersistentVector, PersistentList 등에서 구현 된'cons' 메소드와 다릅니다. – Gert

+0

아, 이제 이해하겠습니다. 말하자면, 핵심 함수'cons'를 말하는 것 같습니다. –

6

당신이 Clojure Data Structures

를 보면 당신은 그 접속사가 목록 및 벡터와 다르게 작동 볼 수 있습니다.

conj는 추가 된 항목을 목록의 앞과 벡터의 끝에 넣습니다.

는 또한 몇 가지 좋은 예제를 가지고 Clojure API conj

보는 것이 좋습니다. ClojureDocs 전반적인 Clojure 명령에는 아주 좋은 예가 몇 가지 있습니다. conj (clojure.org)에서 대

관련 문제