2011-01-02 3 views
3

내 응용 프로그램의 일부를 렌더링 할 수있는 Clojure 응용 프로그램에서 "시각화"라는 메서드가 있습니다. 내가 가진 문제는 애플리케이션에서 자바 클래스이고 일부는 내부적으로 clojure :: idiom을 사용하여 맵 유형을 표시하는 필드가있는 해시 맵이다. 유형이나 내부 유형에 디스패치하기 위해 멀티 맵을 사용할 수는 있지만 동일한 멀티 메소드가 모두 작동하도록 어떻게 할 수 있는지 알고 있습니다.Clojure의 Type 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))) 

그런 다음 당신이 시각화를 호출 할 수 있습니다 자바 클래스 중 하나 또는 같은지도 {: 유형 : 바나나 : 발 "뭔가"}.

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