Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert a list or vector into a sorted-set in Clojure?

In Clojure, the set function automatically converts a vector or list into a set. But this is not the case for sorted-set:

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

Here is a solution I come up with:

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

Is there a better / more idiomatic way to do this without eval?

like image 937
newtonapple Avatar asked Feb 27 '12 09:02

newtonapple


2 Answers

into is also quite useful in such cases.

user=> (into (sorted-set) [3 1 2])
#{1 2 3}
like image 169
kotarak Avatar answered Nov 11 '22 12:11

kotarak


You can use apply for this:

user=> (apply sorted-set [3 1 2])
#{1 2 3}
like image 40
Jonas Avatar answered Nov 11 '22 12:11

Jonas