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