Aplicando um mapa ao argumento de descanso de uma função
No Clojure, se eu tiver uma funçãof,
(defn f [& r] ... )
e eu tenho um seqargs com os argumentos que eu quero chamar f, eu posso facilmente usarAplique:
(apply f args)
Agora, digamos que eu tenha outra funçãog, que é projetado para aceitar qualquer um dos vários argumentos nomeados opcionais - isto é, onde o argumento de resto é desestruturado como um mapa:
(defn g [& {:keys [a b] :as m}] ... )
Eu normalmente ligaria para o g fazendo algo como
(g :a 1 :b 2)
mas se eu tiver um mapameu mapa com o valor {: a 1: b 2}, e eu quero "aplicar" g ao meu mapa - em outras palavras, obter algo que acabaria como a chamada acima, então eu naturalmente não poderia usar aplicar, uma vez que seria equivalente a
(g [:a 1] [:b 2])
Existe uma maneira legal de lidar com isso? Posso ter saído do caminho no meu design para acabar com isso? A melhor solução que posso encontrar seria
(apply g (flatten (seq my-map)))
mas eu certamente não gosto disso. Alguma melhor solução?
EDITAR: Uma ligeira melhoria para a solução sugerida pode ser
(apply g (mapcat seq my-map))
que pelo menos remove uma chamada de função, mas ainda pode não estar muito claro o que está acontecendo.