是否有一个Clojure函数,它接受一个map并返回一系列交替的键和值?

时间:2012-10-07 15:57:14

标签: clojure destructuring

给定一个地图{:a 1 :b [2,3]},是否有一个内置函数可以返回序列(:a 1 :b [2,3])

用例是将一个选项映射应用于一个函数,该函数对参数列表的其余部分进行map-destructured绑定。 Here's an example of this in 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"}

这太糟糕了。我知道我可以自己做这个功能,但我很惊讶我没有找到内置的东西。如果没有内置的东西,那么我可能想避免在库代码中解构像这样的参数列表。

1 个答案:

答案 0 :(得分:4)

这个怎么样:

(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])