Как преобразовать список или вектор в отсортированный набор в Clojure?

В Clojure функция set автоматически преобразует a vector или list в set. Но это не относится к 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)}

Вот решение, которое я придумал:

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

Ответ 1

into также весьма полезен в таких случаях.

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

Ответ 2

Вы можете использовать apply для этого:

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