Question

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?

Was it helpful?

Solution

into is also quite useful in such cases.

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

OTHER TIPS

You can use apply for this:

user=> (apply sorted-set [3 1 2])
#{1 2 3}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top