Ho un codice che utilizza metodi multipli e preferirebbe sovraccaricare la funzione (in questo caso, multi-funzione) in modo che possa passare in una funzione di ordine superiore per aiutare con il test, ad esempio.È possibile sovraccaricare i multi-metodi Clojure su arity?
Ecco l'esempio:
(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))))
Quindi il mio defn fornisce l'arietà sovraccarico, ma mi chiedo se defmethod supporta nulla di simile. (Immagino che non vorreste farlo per ogni dichiarazione di defmethod.)
È questo il più adatto (oserei dire, idiomatico) approccio, o c'è un modo migliore?
mi piace questo e la risposta di Ankur, ma questo usa arity sovraccarico v s l'altro che usa il conteggio degli argomenti per abbinare il valore di dispatch. Suppongo che abbia senso utilizzare l'approccio defn se si desidera la stessa funzione predefinita per ogni valore di dispatch (ed evitare la duplicazione) rispetto a overloading a livello di defmethod se si desidera un valore predefinito diverso per il valore di dispatch. –