我可以在Clojure中同时对类型和属性分派mutli方法吗?

我可以在Clojure中同时对类型和属性分派mutli方法吗?,clojure,multimethod,Clojure,Multimethod,我的Clojure应用程序中有一个名为“visualize”的方法,可以呈现应用程序的任何部分。我遇到的问题是,我的应用程序中有些东西是Java类,有些是hashmaps,其中的字段使用clojure::idiom在内部标记映射的类型。我知道我可以使用multimaps在类型或某些内部类型上进行调度,但我如何才能这样做,使相同的multimethod在这两种类型上都能工作。创建一个调度函数,该函数既可以查找具有特殊标记类型的映射,也可以查找Java类 (defn visualize-dispat

我的Clojure应用程序中有一个名为“visualize”的方法,可以呈现应用程序的任何部分。我遇到的问题是,我的应用程序中有些东西是Java类,有些是hashmaps,其中的字段使用clojure::idiom在内部标记映射的类型。我知道我可以使用multimaps在类型或某些内部类型上进行调度,但我如何才能这样做,使相同的multimethod在这两种类型上都能工作。

创建一个调度函数,该函数既可以查找具有特殊标记类型的映射,也可以查找Java类

(defn visualize-dispatch [foo]
  (if (map? foo) 
    (:type foo)
    (class foo)))

(defmulti visualize visualize-dispatch)

(defmethod visualize String [s] 
  (println "Got a string" s))

(defmethod visualize :banana [b] 
  (println "Got a banana that is" (:val b)))
然后可以使用一个Java类或类似{:type:banana:val“something”}的映射调用visualize

user> (visualize "bikini")
Got a string bikini
user> (visualize {:type :banana :val "speckled"})
Got a banana that is speckled