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?
into
is also quite useful in such cases.
user=> (into (sorted-set) [3 1 2])
#{1 2 3}
You can use apply
for this:
user=> (apply sorted-set [3 1 2])
#{1 2 3}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With