한 가지 차이점은 conj
컬렉션에 삽입 할 인수를 원하는만큼 받아들이고 cons
하나만 사용 한다는 것입니다.
(conj '(1 2 3) 4 5 6)
; => (6 5 4 1 2 3)
(cons 4 5 6 '(1 2 3))
; => IllegalArgumentException due to wrong arity
또 다른 차이점은 반환 값의 클래스입니다.
(class (conj '(1 2 3) 4))
; => clojure.lang.PersistentList
(class (cons 4 '(1 2 3))
; => clojure.lang.Cons
이들은 실제로 상호 교환 할 수 없습니다. 특히, clojure.lang.Cons
구현하지 않습니다 clojure.lang.Counted
소위, count
그것에는 아마 1 + 3으로 줄일이 경우 일정 시간 동작 (더 이상 - 1은 3에서 온다, 첫 번째 요소를 통해 선형 탐색에서 비롯 (next (cons 4 '(1 2 3))
되 PersistentList
및 따라서 Counted
).
이름 뒤에있는 의도는 cons
cons (truct a seq) 1을conj
의미하는 반면 conj (oin an item on a collection)을 의미합니다. 에 seq
의해 생성되는 cons
것은 첫 번째 인수로 전달 된 요소 로 시작 하고 두 번째 인수에 의 적용으로 인해 발생하는 것을 next
/ rest
부분 으로 갖습니다 seq
. 위에 표시된 것처럼 모든 것은 클래스 clojure.lang.Cons
입니다. 반대로, conj
항상 전달 된 컬렉션과 거의 동일한 유형의 컬렉션을 반환합니다. (대략 9 개 이상의 항목 PersistentArrayMap
이 늘어 나면 a 가 a PersistentHashMap
로 바뀝니다.)
1 전통적으로 Lisp 세계에서 cons
cons (tructs a pair), 그래서 Clojure는 Lisp 전통에서 cons
기능이 전통적 cdr
. cons
"여러 값을 함께 보유하기 위해 어떤 유형 또는 다른 유형의 레코드를 구성"을 의미 하는 일반화 된 용법 은 현재 프로그래밍 언어 및 그 구현 연구에서 유비쿼터스입니다. 그것이 "consing consing"이 언급 될 때의 의미입니다.