2011-01-02 1 views
3

У меня есть метод, называемый «визуализировать» в приложении Clojure, который может якобы отображать любую часть моего приложения. Проблема в том, что некоторые вещи в моем приложении - это классы Java, а некоторые - hashmaps, причем поля, которые внутренне маркируют тип карты, используют clojure :: idiom. Я знаю, что я могу использовать multimaps для отправки по типу или по некоторому внутреннему типу, но как я могу это сделать, чтобы один и тот же multimethod работал на BOTH.Могу ли я отправить mutli-метод на свойства Type AND в Clojure?

ответ

5

Создайте функцию отправки, которая ищет карты со специальным типом маркера и для классов 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-классов или карту, как {Тип: банан: VAL «что-то»}.

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