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

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

(defn f [& r] ... )

而且我有一个seq args,其中包含我想调用f的参数,我可以轻松地使用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中,换句话说,得到的东西最终会像上面的调用一样,那么我自然无法使用apply,因为它等同于

(g [:a 1] [:b 2])

有没有解决这个问题的好方法?我可以在设计中偏离轨道以解决这个问题吗?我能找到的最佳解决方案是

(apply g (flatten (seq my-map)))

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

编辑:对建议的解决方案的轻微改进可能是

(apply g (mapcat seq my-map))

至少删除了一个函数调用,但是可能还不太清楚发生了什么.

最佳答案
我本人偶然发现了这个问题,并最终定义了期望一张地图的函数.映射可以具有可变数量的键/值对,并且如果足够灵活,则不需要&休息的争论.也没有痛苦适用.让生活变得更加轻松!

(defn g [{:keys [a b] :as m}] ... )

转载注明原文:clojure-将映射应用于函数的rest参数 - 代码日志