関数は 2 つのパラメーターを必要とします (アリティ 2 を持ちます)。最初のパラメーターの名前は_
(アンダースコア) で、これは通常、使用されない変数を示します。(これは有効な変数名であり、バインドされますが、慣例により使用されないため、プレースホルダーを示します。)
2 番目のパラメーターは destructured -{:keys [kind]}
です。これは、期待される値がマップであることを意味し、名前付きの変数を分解した結果、実際のパラメーターのキーの値 (または、そのようなキーがない場合は nil)kind
にバインドされます。:kind
したがって、関数は 2 つのパラメーターを想定しています。最初のパラメーターは無視され、2 番目のパラメーターはキーを持つマップでなければなりません:kind
(他のキーも同様ですが、無視されます)。
((fn [_ {:keys [kind]}] kind) :foo {:kind :bar, :color :green})
=> :bar
PS私はあなたの質問をもう一度見て、あなたの混乱がどこから来ているのかを理解しました. 構文[_ {:kind [kind]}]
は、2 番目の位置にマップを含むベクトルのように見えます。その通りですが、Clojure のどこにでもベクトル表記があるとは限りません。Clojure は、関数の仮パラメーターのリストに角括弧を使用します。これは、シーケンスが予想されるあらゆる場所でベクトル リテラルを使用するという Clojure の一般的なパターンの一部です。リストを関数適用形式として解釈することを避けるために、多くの場所で慎重に引用符を使用する必要がある他の Lisp と比較して、実際には非常に便利です。しかし、それは余談です。重要な点はfn
(およびdefn
) にあります。角括弧はパラメーター リストを示し、パラメーターがベクトルであることを意味するものではありません。