2012-02-27 14 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} 

はevalをせずにこれを行うには良い/より多くの慣用的な方法はありますか?

答えて

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」は、起こっていることを伝える(1つのデータ構造を別のデータ構造にする)ために、より慣用的であり、既存の宛先データ構造と共に使用することができます。 –