マルチメソッドを使用するコードがあり、理想的には関数 (この場合はマルチ関数) をオーバーロードして、たとえばテストに役立つ高次関数を渡すことができるようにしたいと考えています。
次に例を示します。
(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 宣言ごとに実行したくないと思います。)
これは最も適切な (あえて言いますが、慣用的な) アプローチですか、それとももっと良い方法がありますか?