Clojure では、関数fがある場合、
(defn f [& r] ... )
そして、 f を呼び出したい引数を持つseq argsがあるので、簡単にapplyを使用できます:
(apply f args)
ここで、別の関数gがあるとします。この関数は、多数のオプションの名前付き引数のいずれかを取るように設計されています。つまり、残りの引数はマップとして分解されます。
(defn g [& {:keys [a b] :as m}] ... )
私は通常、次のようなことで g を呼び出します
(g :a 1 :b 2)
しかし、たまたま値 {:a 1 :b 2} を持つマップmy-mapがあり、g を my-map に「適用」したい場合、つまり、上記の呼び出しのようになる何かを取得します。 、それから私は当然適用できませんでした。
(g [:a 1] [:b 2])
これを処理する良い方法はありますか?設計の軌道から外れて、これになってしまったのではないでしょうか? 私が見つけることができる最善の解決策は
(apply g (flatten (seq my-map)))
しかし、私は確かにそれが好きではありません。より良い解決策はありますか?
編集:提案された解決策に対するわずかな改善は、
(apply g (mapcat seq my-map))
これにより、少なくとも 1 つの関数呼び出しが削除されますが、何が起こっているのかはまだ明確ではない可能性があります。