У меня есть код, который использует несколько методов и в идеале хотел бы перегрузить функцию (в данном случае, многофункциональную), чтобы я мог, например, передать функцию более высокого порядка, чтобы помочь в тестировании.Можно ли перегрузить Clojure мульти-методы на arity?
Вот пример:
(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.)
Это самый подходящий (смею я говорю, идиоматический) подход, или есть лучший способ?
Мне это нравится, и ответ ANKUR, но это один использует Arity перегружать vs другой, который использует счетчик аргументов, чтобы соответствовать значению отправки. Я полагаю, что имеет смысл использовать подход defn, если вы хотите использовать одну и ту же функцию по умолчанию для каждого значения отправки (и избегать дублирования) и перегрузки на уровне defmethod, если вам нужно другое значение по умолчанию для каждого значения отправки. –