2012-02-27 1 views
11

Clojure에서 set 함수는 vector 또는 list을 자동으로 set으로 변환합니다. 그러나 이것은 sorted-set의 경우에는 해당되지 않습니다 :Clojure에서 목록 또는 벡터를 정렬 된 집합으로 변환하는 방법은 무엇입니까?

여기
(set [3 2 1]) ; #{1 2 3} 
(set '(3 2 1)) ; #{1 2 3} 
(sorted-set [3 2 1]) ; #{[3 2 1]} 
(sorted-set '(3 2 1)) ; #{(3 2 1)} 

이다 내가 가지고 올 해결책 :

(defn sorted-set-from-coll [coll] 
    (eval (cons sorted-set (seq coll)))) 

(def v [3 2 1]) 
(sorted-set-from-coll v)  ; #{1 2 3} 
(sorted-set-from-coll '(3 2 1)) ; #{1 2 3} 
(sorted-set-from-coll [3 1 2]) ; #{1 2 3} 

은 평가하지 않고이 작업을 수행 할 수있는 더 나은/더 관용적 방법이 있나요?

답변

18

into는 또한 경우에 매우 유용합니다.

user=> (into (sorted-set) [3 1 2]) 
#{1 2 3} 
9

이에 대한 apply를 사용할 수 있습니다

user=> (apply sorted-set [3 1 2]) 
#{1 2 3} 
+2

'into'는 일어나는 일 (하나의 데이터 구조에서 다른 데이터 구조로)을 전달하고 기존 대상 데이터 구조와 함께 사용할 수 있으므로 더 관용적입니다. –