Aplicando un mapa al argumento de reposo de una función.

En Clojure, si tengo una función.f,

(defn f [& r] ... )

y tengo un seqargs con los argumentos con los que quiero llamar f, puedo usar fácilmenteaplicar:

(apply f args)

Ahora, digamos que tengo otra función.g, que está diseñado para tomar cualquiera de una serie de argumentos con nombre opcionales, es decir, donde el resto del argumento se desestructura como un mapa:

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

Normalmente llamaría g haciendo algo como

(g :a 1 :b 2)

pero si resulta que tengo un mapami mapa con el valor {: a 1: b 2}, y quiero "aplicar" g a my-map; en otras palabras, obtener algo que terminaría como la llamada anterior, entonces, naturalmente, no pude usar aplicar, ya que sería equivalente a

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

¿Hay una buena manera de manejar esto? ¿Puedo haber salido de la pista en mi diseño para terminar con esto? La mejor solución que puedo encontrar sería

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

pero seguramente no me gusta. ¿Alguna solución mejor?

EDITAR: Una ligera mejora de la solución sugerida podría ser

(apply g (mapcat seq my-map))

que al menos elimina una llamada de función, pero aún no está muy claro lo que está sucediendo.

Respuestas a la pregunta(4)

Su respuesta a la pregunta