2011-01-04 10 views
5

Chciałbym móc wywoływać funkcje Clojure używając argumentów słów kluczowych tak:Czy ktoś wie o dobrym sposobie dostarczania argumentów dotyczących słów kluczowych w Clojure?

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

: Czy to możliwe, bez konieczności wykonywania:

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

: i mogę również użyć: pre pre -warunki zapewniające pewien rodzaj sprawdzania poprawności, aby upewnić się, że wszystkie argumenty są uwzględnione?

+0

możliwe duplikat [Clojure - nazwanych argumentów] (http://stackoverflow.com/questions/3337888/clojure -named-arguments) – Rayne

Odpowiedz

3

Jeśli chcesz domyślne wartości dla args słów kluczowych wykonaj następujące czynności (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

Czy: czy część składni czy drugi sposób robienia tego? – Zubair

+0

@Zubair: ': lub" jest opcjonalne. Jeśli nie zostanie podany, argumenty otrzymują wartość null, jeśli ich brakuje: '(defn foo [req1 req2 & {: keys [opt1 opt2]}] [req1 req2 opt1 opt2]) (foo: a: b) => [: a: b zero zero] ' – Ralph

5

Złożone args są dostarczane przez wbudowany rozpad args resztę (choć main docs for destructuring niestety nie pokrywa ten dodatek w 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]] 

Wszystkie zwykłymi obiektów map destructuring są dostępne (np :or, :strs, :syms itd.).

Powiązane problemy