Можно ли перегрузить несколько -методов Clojure по арности?

У меня есть код, который использует методы multi -и в идеале хотел бы перегрузить функцию (, в данном случае multi -function ), чтобы я мог передать функцию более высокого порядка помочь с тестированием, например.

Вот пример.:

(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))))

Итак, мой defn обеспечивает перегрузку арности, но мне интересно, поддерживает ли defmethod что-то подобное. (Думаю, вам не стоит делать это для каждого объявления defmethod.)

Является ли это наиболее подходящим (осмелюсь сказать, идиоматическим)подходом, или есть способ получше?

18
задан Andrew Whitehouse 25 April 2012 в 10:16
поделиться