将映射应用于函数的rest参数

Mar*_*ama 11 clojure

在Clojure中,如果我有一个函数f,

(defn f [& r] ... )
Run Code Online (Sandbox Code Playgroud)

并且我有一个seq args,其中包含我想要调用的参数,我可以轻松地使用apply:

(apply f args)
Run Code Online (Sandbox Code Playgroud)

现在,假设我有另一个函数g,它被设计为采用任意一些可选的命名参数 - 也就是说,其余参数被解构为map:

(defn g [& {:keys [a b] :as m}] ... )
Run Code Online (Sandbox Code Playgroud)

我通常会做类似的事情来称呼g

(g :a 1 :b 2)
Run Code Online (Sandbox Code Playgroud)

但是如果我碰巧有一张地图my-map,其值为{:a 1:b 2},我想将"g"应用到我的地图上 - 换句话说,得到一些最终会成为上述调用的内容,然后我自然不能使用申请,因为它相当于

(g [:a 1] [:b 2])
Run Code Online (Sandbox Code Playgroud)

有一个很好的方法来处理这个?我的设计可能会偏离轨道吗?我能找到的最佳解决方案是

(apply g (flatten (seq my-map)))
Run Code Online (Sandbox Code Playgroud)

但我肯定不喜欢它.更好的解决方案?

编辑:建议的解决方案可能略有改进

(apply g (mapcat seq my-map))
Run Code Online (Sandbox Code Playgroud)

至少删除一个函数调用,但它可能仍然不是很清楚正在发生什么.

Mic*_*ent 6

我自己偶然发现了这个问题,最后定义了一个期望一个地图的函数.映射可以具有可变数量的键/值对,并且如果足够灵活,则不需要&rest参数.申请也没有痛苦.让生活更轻松!

(defn g [{:keys [a b] :as m}] ... )
Run Code Online (Sandbox Code Playgroud)