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

是否有一个Clojure函数,它接受一个映射并返回一系列交替的键和值?,clojure,destructuring,Clojure,Destructuring,给定一个map{:a1:b[2,3]},是否有一个内置函数可以返回序列(:a1:b[2,3]) 该用例将选项映射应用于函数,该函数将解构绑定映射到参数列表的其余部分。下面是一个人为的例子来说明: (defn make-car [& {:as options}] (assoc options :car true)) (make-car :color "red" :speed "fast") ; => {:car true, :speed "fast", :color "red"}

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

该用例将选项映射应用于函数,该函数将解构绑定映射到参数列表的其余部分。下面是一个人为的例子来说明:

(defn make-car [& {:as options}] (assoc options :car true))
(make-car :color "red" :speed "fast")
; => {:car true, :speed "fast", :color "red"}
现在,如果我们想单独管理选项并将其应用于函数,我们有一个问题:

(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"}
这太糟糕了。我知道我可以制作自己的函数来实现这一点,但我很惊讶我没有找到内置的东西。如果没有内置的东西,那么我可能希望避免在库代码中像这样分解参数列表。

这样如何:

(reduce concat {:a 1 :b [2,3]})
(:a 1 :b [2 3])
根据amalloy的评论进行更新。 Apply更高效(至少在1.4中是这样),并且可以获得相同的结果

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

我相信你在寻找这个:显然它没有进入核心。我同意这有点奇怪。PS:
(comp(partial apply concat)seq)
imho看起来比interleave好一点,尽管内置的当然会更好。
(reduce concat)
对于大序列非常危险,对于小序列则毫无必要地低效。改用
(应用concat)
。是什么让大序列变得危险?嘿,谢谢@amalloy。我做了一些测试,你的申请速度肯定是对的。用注释更正答案。就危险而言——我想可能是堆栈溢出,或者速度非常慢。请尝试
(首先(f concat(重复1e5[1]))
,用
应用
减少
替换
f
。有关具有相同问题的类似代码的说明,请参阅。