В Clojure, если у меня есть функция f,
(defn f [& r] ... )
и у меня есть seq args с аргументами, которые я хочу вызвать f, я могу легко использовать apply:
(apply f args)
Теперь, скажем, у меня есть еще одна функция g, которая предназначена для принятия любого из нескольких необязательных именованных аргументов - то есть, где аргумент rest разрушен как карта:
(defn g [& {:keys [a b] :as m}] ... )
Обычно я называю g, делая что-то вроде
(g :a 1 :b 2)
но если у меня есть карта my-map со значением {: a 1: b 2}, и я хочу "применить" g к моей карте - другими словами, получить что-то, что закончилось бы как вышеупомянутый вызов, тогда я, естественно, не смог бы использовать apply, так как он был бы эквивалентен
(g [:a 1] [:b 2])
Есть ли хороший способ справиться с этим? Могу ли я уйти с пути в мой дизайн, чтобы закончить с этим? Лучшее решение, которое я могу найти, будет
(apply g (flatten (seq my-map)))
но мне это точно не нравится. Любые лучшие решения?
EDIT: Небольшое улучшение предлагаемого решения может быть
(apply g (mapcat seq my-map))
который, по крайней мере, удаляет один вызов функции, но может все еще не совсем ясно, что происходит.