53

Common Lisp では、次のことができます。

(defun foo (bar &key baz quux)
  (list bar baz quux))

(foo 1 :quux 3 :baz 2) ; => (1 2 3)

Clojure にはキーワード引数がありません。1つの代替手段は次のとおりです。

(defn foo [bar {:keys [baz quux]}] 
  (list bar baz quux))

(foo 1 {:quux 3 :baz 2}) ; => (1 2 3)

ネストされたブラケットが多すぎて、常に入力して読み取る必要はありません。また、フラット リストではなく、明示的なハッシュ マップを引数として渡す必要があります。

誰かが句読点爆弾を仕掛けたように見えない最も慣用的な Clojure のキーワード引数に相当するものは何ですか?

4

3 に答える 3

101

Clojure 1.2 のこの回答を更新するために、バインドの分割のマップ フォームによって提供されるデフォルトで完全なキーワード arg がサポートされるようになりました。

user> (defn foo [bar &{ :keys [baz quux] 
                        :or {baz "baz_default" quux "quux_default"}}]
         (list bar baz quux))
#'user/foo

user> (foo 1 :quux 3)
(1 "baz_default" 3)
于 2010-10-19T14:55:34.573 に答える
39

clojure でキーワード引数をシミュレートする簡単な方法は、次のように残りのパラメーターで hash-map を使用することです。

> (defn kwtest [x & e] (:foo (apply hash-map e)))
#'user/kwtest
> (kwtest 12 :bar "ignored" :foo "returned")
"returned"

Rich Hickey は、キーワード パラメーターを提供するclojure google グループからのこのメッセージでマクロを提供しました。対応するスレッドには、キーワード パラメーターが clojure でサポートされていない理由に関する情報が含まれています。基本的に、実行時のオーバーヘッドを回避するためです。リッチは、このメッセージで私が上に示した方法を説明しています

于 2009-04-04T23:19:19.207 に答える
9

最近追加されたclojure.contrib.defのはdefnkマクロです。これにより、キーワード引数を使用して関数を定義できます(ここを参照)。

于 2009-06-16T12:37:24.140 に答える