2012-02-27 20 views
11

En Clojure, la función set convierte automáticamente un vector o list en un set. Pero este no es el caso para sorted-set:¿Cómo convertir una lista o un vector en un conjunto ordenado en Clojure?

(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)} 

Aquí es una solución me ocurren:

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

¿Existe una manera mejor/más idiomática de hacer esto sin eval?

Respuesta

18

into también es muy útil en estos casos.

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

Se puede utilizar para este apply:

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

'into' es más idiomático ya que transmite lo que está sucediendo (una estructura de datos en otra), y se puede utilizar con una estructura de datos de destino existente. –

Cuestiones relacionadas