2012-02-27 28 views
11

Clojure'da, set işlevi, vector veya list'u otomatik olarak set içine dönüştürür. Ama bu sorted-set için durum böyle değildir:Bir liste veya vektör Clojure içinde sıralanmış bir kümeye nasıl dönüştürülür?

İşte
(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)} 

olduğunu ben ile gelip bir çözüm:

(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 olmadan bunu yapmak için daha iyi/daha deyimsel yolu var mı?

cevap

18

into da bu gibi durumlarda oldukça yararlıdır. hem (başka bir bir veri tipleri de) oluyor ve mevcut bir hedef veri tipleri de kullanılabilir neler aktarıyor olarak

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

Bunun için apply kullanabilirsiniz:

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

'into' daha deyimseldir. –