Tengo un código que usa métodos múltiples y, idealmente, me gustaría sobrecargar la función (en este caso, multifunción) para que pueda pasar una función de orden superior para ayudar con las pruebas, por ejemplo.¿Es posible sobrecargar los métodos múltiples de Clojure en Arity?
Aquí está el ejemplo:
(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))))
Así que mi defn proporciona la aridad sobrecarga pero me pregunto si es compatible con defmethod nada como esto. (Supongo que no querría hacerlo para cada declaración de defmethod.)
¿Es este el enfoque más adecuado (me atrevo a decir, idiomático), o hay una manera mejor?
me gusta esto y la respuesta de Ankur, pero éste utiliza aridad sobrecarga v s el otro que usa el recuento de argumentos para hacer coincidir el valor de envío. Supongo que tiene sentido utilizar el enfoque defn si desea la misma función predeterminada para cada valor de despacho (y evitar la duplicación) frente a la sobrecarga en el nivel de definición si desea un valor predeterminado diferente por valor de despacho. –