Anwenden einer Map auf das rest-Argument einer Funktion

In Clojure, wenn ich eine Funktion habef,

(defn f [& r] ... )

und ich habe eine seqArgumente Mit den Argumenten, mit denen ich f aufrufen möchte, kann ich leicht umgehensich bewerben:

(apply f args)

Sagen wir jetzt, ich habe eine andere Funktiong, der für eine Reihe optionaler, benannter Argumente ausgelegt ist - das heißt, das restliche Argument wird als Map destrukturiert:

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

Normalerweise würde ich g anrufen, indem ich so etwas mache

(g :a 1 :b 2)

aber wenn ich zufällig eine karte habemeine-karte mit dem Wert {: a 1: b 2}, und ich möchte g auf meine Karte "anwenden" - mit anderen Worten, etwas bekommen, das wie der obige Aufruf enden würde, dann könnte ich natürlich nicht anwenden verwenden, da es wäre äquivalent zu

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

Gibt es eine gute Möglichkeit, damit umzugehen? Darf ich in meinem Design aus der Bahn geraten sein, um damit fertig zu werden? Die beste Lösung, die ich finden kann, wäre

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

aber es gefällt mir bestimmt nicht. Irgendwelche besseren Lösungen?

BEARBEITEN: Eine leichte Verbesserung der vorgeschlagenen Lösung könnte sein

(apply g (mapcat seq my-map))

Damit wird zumindest ein Funktionsaufruf entfernt, aber es ist möglicherweise immer noch nicht ganz klar, was los ist.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage