2013-05-01 7 views
3

빠른 clojure 질문,이 구문은 대부분 관련이 있다고 생각합니다. 어떻게 예를 들어, 내가 인수의 특정 유형의 서명을 기반으로 multimethod을 파견 할 :Clojure : 다른 클래스 유형에 defmulti

(defn foo 
    ([String a String b] (println a b)) 
    ([Long a Long b] (println (+ a b)) 
    ([String a Long b] (println a (str b)))) 

내가 예를 들어지도 다음에 두 개의 문자열, 더블,이 다음지도에, 임의의 물건이를 확장 할 IFN 등 뒤에 두 배 ... REPL에서

답변

6
(defn class2 [x y] 
    [(class x) (class y)]) 

(defmulti foo class2) 

(defmethod foo [String String] [a b] 
    (println a b)) 

(defmethod foo [Long Long] [a b] 
    (println (+ a b))) 

는 :

user=> (foo "bar" "baz") 
bar baz 
nil 
user=> (foo 1 2) 
3 
nil 

또한 type 대신사용을 고려할 수; type:type 메타 데이터를 반환하고 class으로 위임합니다.

또한 class2을 최상위 수준에서 정의 할 필요는 없습니다. (fn [x y] ...)을 배송 기능으로 defmulti에 전달하는 것도 좋습니다.