2011-01-04 9 views
5

私はこのようなキーワード引数を使ってClojureの関数を呼び出すことができるようにしたいと思います:誰かがClojureでキーワード引数を提供する良い方法を知っていますか?

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

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

:これは何をすることなく可能であり、私はまた、使用することができます前前すべての引数が含まれていることを確認するための一種の検証を提供する条件?

+0

可能複製(http://stackoverflow.com/questions/3337888/clojure -named-arguments) – Rayne

答えて

3

キーワード引数のデフォルト値を使用する場合は、次の(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] 
[Clojureの - 名前付き引数]の
+0

:構文の一部またはそれの第2の方法ですか? – Zubair

+0

@Zubair: ':or'はオプションです。提供されていない場合、引数は欠落している場合、値nullを取得します: '(defn foo [req1 req2&{:keys [opt1 opt2]}] [req1 req2 opt1 opt2])(foo:a:b) [:a:b nil nil] ' – Ralph

5

キーワード引数が(残念ながら1.2で、この追加をカバーしていないmain docs for destructuringが)残りの引数の組み込みの非構造によって提供されています

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

通常のマップの非構造施設のすべての

が可能です(例: :or, :strs, :symsなど)。

関連する問題