2011-01-04 12 views
5

Vorrei essere in grado di richiamare le funzioni Clojure usando argomenti a parola chiave in questo modo:Qualcuno sa di un buon modo per fornire argomenti di parole chiave in Clojure?

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

: Questo è possibile, senza dover fare:

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

: e potrebbe anche utilizzare: pre pre -condizioni per fornire una sorta di convalida per assicurarsi che tutti gli argomenti siano inclusi?

+0

possibile duplicato di [Clojure - argomenti con nome] (http://stackoverflow.com/questions/3337888/clojure -named-arguments) – Rayne

risposta

3

Se volete valori di default per la parola chiave args fare quanto segue (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

Is: o parte della sintassi o un secondo modo di farlo? – Zubair

+0

@Zubair: ': o' è facoltativo. Se non viene fornito, gli argomenti ottengono il valore null se mancano: '(defn foo [req1 req2 & {: keys [opt1 opt2]}] [req1 req2 opt1 opt2]) (foo: a: b) => [: a: b nil nil] ' – Ralph

5

args chiave sono forniti dalla destrutturazione built-in di args di riposo (anche se il main docs for destructuring purtroppo non copre questa aggiunta in 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]] 

Tutti i consueti servizi mappa destrutturazione sono disponibili (ad esempio, :or, :strs, :syms, ecc.).

Problemi correlati