1. ホーム
  2. clojure

Clojure - 名前付き引数

2023-07-28 19:57:10

質問

Clojureには名前付き引数がありますか?もしそうなら、その小さな例を提示してもらえますか?

どのように解決するのですか?

Clojure 1.2において、Clojure 1.1.0からClojure 1.2.0への移行に伴って rest をマップを再構築するのと同じように再構築できます。これは、名前付き非位置指定キーワード引数を行えることを意味します。以下はその例です。

user> (defn blah [& {:keys [key1 key2 key3]}] (str key1 key2 key3))
#'user/blah
user> (blah :key1 "Hai" :key2 " there" :key3 10)
"Hai there10"
user> (blah :key1 "Hai" :key2 " there")
"Hai there"
user> (defn blah [& {:keys [key1 key2 key3] :as everything}] everything)
#'user/blah
user> (blah :key1 "Hai" :key2 " there")
{:key2 " there", :key1 "Hai"}

何でも は、Clojureマップを再構築している間にできることは、上に示すように関数の引数リストで行うことができます。このように引数のデフォルトを定義するために :or を使用することも含みます。

user> (defn blah [& {:keys [key1 key2 key3] :or {key3 10}}] (str key1 key2 key3))
#'user/blah
user> (blah :key1 "Hai" :key2 " there")
"Hai there10"

しかし、これはClojure 1.2での話です。あるいは、古いバージョンでは、同じことをシミュレートするために、これを行うことができます。

user> (defn blah [& rest] (let [{:keys [key1 key2 key3] :or {key3 10}} (apply hash-map rest)] (str key1 key2 key3)))
#'user/blah
user> (blah :key1 "Hai" :key2 " there")
"Hai there10"

で、これもだいたい同じように動きます。

そして、キーワード引数の前に来る位置引数も持つことができます。

user> (defn blah [x y & {:keys [key1 key2 key3] :or {key3 10}}] (str x y key1 key2 key3))
#'user/blah
user> (blah "x" "Y" :key1 "Hai" :key2 " there")
"xYHai there10"

これらはオプションではなく、必ず提供されなければなりません。

を実際に再構築することができます。 rest の引数は、Clojureのコレクションと同じように再構成できます。

user> (defn blah [& [one two & more]] (str one two "and the rest: " more))
#'user/blah
user> (blah 1 2 "ressssssst")
"12and the rest: (\"ressssssst\")"

Clojure 1.1でもこのようなことは可能です。しかし、キーワード引数のためのマップスタイルの再構築は1.2になってからです。