2013-05-01 2 views
3

Быстрый вопрос о clojure, я думаю, что это в основном синтаксис. Как я направить Многометодный на основе конкретных сигнатур типов аргументов, например: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 и т.д. ...

ответ

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 вместо class; type возвращение :type метаданные, передача class если нет.

Кроме того, class2 не должен определяться на верхнем уровне; минуя (fn [x y] ...) как функция отправки к defmulti также хорошо.