Czy możliwe jest przeciążenie wielu metod Clojure na arity?

Mam jakiś kod, który używa wielu metod i idealnie chciałby przeciążyć funkcję (w tym przypadku, wielofunkcyjną), tak żebym mógł np. Przekazać funkcję wyższego rzędu, aby pomóc w testowaniu.

Oto przykład:

<code>(ns multi)

(defn my-print [m] (println "The colour is" (:colour m)))

(defmulti which-colour-mm (fn [m f] (:colour m)))

(defmethod which-colour-mm :blue [m f] (f m))
(defmethod which-colour-mm :red [m f] (f m))
(defmethod which-colour-mm :default [m f] (println "Default: Neither Blue nor Red"))

(defn which-colour
  ([m] (which-colour-mm m my-print))
  ([m f] (which-colour-mm m f)))

(which-colour {:colour :blue :object :ball})
(which-colour {:colour :yellow :object :ball})
(which-colour {:colour :blue :animal :parrot} (fn [m] (println "The " (:animal m) "is" (:colour m))))
</code>

Więc mój defn zapewnia przeciążenie arity, ale zastanawiam się, czy defmethod obsługuje coś takiego. (Chyba nie chciałbyś tego robić dla każdej deklaracji defmethod.)

Czy to najbardziej odpowiednie (ośmielę się powiedzieć,idiomatyczny) podejście, czy jest lepszy sposób?

questionAnswers(3)

yourAnswerToTheQuestion