4

マップが与えられた場合{:a 1 :b [2,3]}、シーケンスを返す組み込み関数はありますか(:a 1 :b [2,3])

ユースケースは、引数リストの残りの部分でマップ非構造化バインディングを実行する関数にオプションマップを適用することです。これがcore.cacheの例です。説明するために考案された例を次に示します。

(defn make-car [& {:as options}] (assoc options :car true))
(make-car :color "red" :speed "fast")
; => {:car true, :speed "fast", :color "red"}

ここで、オプションを個別に管理し、applyそれらを関数に対して管理する場合、問題が発生します。

(def options {:color "red" :speed "fast"})
(apply make-car options)
; => {:car true, [:speed "fast"] [:color "red"]}

...もちろん、seqマップのはそのキーと値のペアのシーケンスであるためです。これは私が思いついた最高のものです:

(apply make-car (interleave (keys options) (vals options)))
; => {:car true, :speed "fast", :color "red"}

これはかなりひどいです。これを行うために自分の関数を作成できることは知っていますが、組み込みのものが見つからないことに驚いています。何かが組み込まれていない場合は、ライブラリコードでこのような引数リストを破棄することは避けたいと思います。

4

1 に答える 1

5

これはどう:

(reduce concat {:a 1 :b [2,3]})
(:a 1 :b [2 3])

amalloyからのコメントに基づいて更新します。適用はより効率的で(少なくとも1.4では)、同じ結果を達成します!

(apply concat {:a 1 :b [2,3]})
(:a 1 :b [2 3])
于 2012-10-07T16:37:53.200 に答える