2012-02-27 16 views
11

Trong Clojure, chức năng set sẽ tự động chuyển đổi vector hoặc list thành set. Nhưng đây không phải là trường hợp cho sorted-set:Làm thế nào để chuyển đổi danh sách hoặc vectơ thành tập hợp được sắp xếp trong 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)} 

Đây là một giải pháp tôi đưa ra:

(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} 

Có một/cách nhiều thành ngữ tốt hơn để làm điều này mà không eval?

Trả lời

18

into cũng khá hữu ích trong trường hợp này.

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

Bạn có thể sử dụng apply cho việc này:

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

'thành' là thành ngữ hơn vì nó truyền tải những gì đang diễn ra (một cơ sở hạ tầng khác) và có thể được sử dụng với cơ sở hạ tầng đích hiện tại. –