2010-07-01 15 views
8

Supongamos que tengo un vector de pares clave-valor que quiero poner en un mapa.¿Cuál es la forma más idiomática de pasar vectores en var-args en clojure?

(def v [k1 v1 k2 v2]) 

que hacen este tipo de cosas:

(apply assoc (cons my-map v)) 

Y, de hecho, he encontrado a mí mismo haciendo este patrón,

(apply some-function (cons some-value some-seq)) 

varias veces en los últimos dos días. ¿Es esto idiomático, o hay una forma más agradable de mover argumentos de las secuencias a las funciones?

Respuesta

10

apply toma argumentos adicionales entre el nombre de la función y el último argumento seq.

user> (doc apply) 
------------------------- 
clojure.core/apply 
([f args* argseq]) 
    Applies fn f to the argument list formed by prepending args to argseq. 

Eso es lo que args* medios. Entonces usted puede hacer esto:

user> (apply assoc {} :foo :bar [:baz :quux]) 
{:baz :quux, :foo :bar} 
user> (apply conj [] :foo :bar [:baz :quux]) 
[:foo :bar :baz :quux] 
+0

Ahh, allí está. Sabía que me estaba perdiendo algo. Gracias, Brian. –

Cuestiones relacionadas