Как преобразовать список или вектор в отсортированный набор в Clojure? - PullRequest
11 голосов
/ 27 февраля 2012

В Clojure функция set автоматически преобразует 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

Ответы [ 2 ]

18 голосов
/ 27 февраля 2012

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

user=> (into (sorted-set) [3 1 2])
#{1 2 3}
9 голосов
/ 27 февраля 2012

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

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