2011-01-02 8 views
3

私はClojureアプリケーション内に "visualize"というメソッドを持っていますが、これはおそらくアプリケーションの一部をレンダリングすることができます。私が持っている問題は、アプリケーション内のいくつかのものがJavaクラスであり、いくつかはハッシュマップであり、フィールドは内部的にclojure :: idiomを使ってマップのタイプをマークしているということです。私はマルチマップを使用して型や内部の型にディスパッチすることができますが、同じマルチメソッドが両方で動作するようにするにはどうすればよいでしょうか。Clojureの両方の型ANDプロパティにmutli-methodをディスパッチできますか?

答えて

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クラスまたは{:type:banana:val "something"}のいずれかのマップでvisualizeを呼び出すことができます。

user> (visualize "bikini") 
Got a string bikini 
user> (visualize {:type :banana :val "speckled"}) 
Got a banana that is speckled 
関連する問題