2011-01-04 12 views
5

Me gustaría ser capaz de llamar a las funciones clojure utilizando argumentos clave de esta manera:¿Alguien sabe de una buena manera de proporcionar argumentos clave en Clojure?

(do-something :arg1 1 :arg2 "Hello") 

: ¿Es esto posible sin tener que hacer:

(do-something {:arg1 1 :arg2 "Hello"}) 

: y podría también utilizar: pre pre -condiciones para proporcionar algún tipo de validación para asegurarse de que todos los argumentos están incluidos?

+0

posible duplicado de [Clojure - argumentos con nombre] (http://stackoverflow.com/questions/3337888/clojure -named-arguments) – Rayne

Respuesta

3

Si desea que los valores por defecto de los argumentos de palabras clave hacer lo siguiente (Clojure 1.2):

(defn foo 
    [req1 req2 & {:keys [opt1 opt2] :or {opt1 :hello opt2 :goodbye}}] 
    [req1 req2 opt1 opt2]) 
#'user/foo 
user=> (foo :a :b) 
[:a :b :hello :goodbye] 
user=> (foo :a :b :opt1 "xyz") 
[:a :b "xyz" :goodbye] 
+0

¿Es: o parte de la sintaxis o una segunda forma de hacerlo? – Zubair

+0

@Zubair: ': o' es opcional. Si no se proporciona, los argumentos obtienen el valor nulo si faltan: '(defn foo [req1 req2 & {: keys [opt1 opt2]}] [req1 req2 opt1 opt2]) (foo: a: b) => [: a: b nil nil] ' – Ralph

5

argumentos de palabras clave son proporcionados por la desestructuración integrado de argumentos de descanso (aunque el main docs for destructuring lamentablemente no cubre esta adición en 1,2):

(defn foo 
    [a b & {:keys [c d]}] 
    [a b c d]) 
#'user/foo 
(foo 1 2 :c 12 :d [1]) 
[1 2 12 [1]] 

Todas las instalaciones habituales mapa desestructuración están disponibles (por ejemplo, :or, :strs, :syms, etc.).

Cuestiones relacionadas