Clojure:对不同的类类型进行defmulti

时间:2013-05-01 21:36:54

标签: clojure signature method-signature multimethod

快速的clojure问题,我认为这主要与语法有关。如何根据参数的特定类型签名调度多方法,例如:

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

我想将它扩展为任意内容,例如两个字符串后跟一个地图,后面跟着一个double,两个双打后跟一个IFn等......

2 个答案:

答案 0 :(得分:7)

(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)))

来自REPL:

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

您还可以考虑使用type代替class; type会返回:type元数据,如果没有,则委托给class

此外,class2不必在顶层定义;将(fn [x y] ...)作为调度函数传递给defmulti也很好。

答案 1 :(得分:1)

如果您使用type而不是class,则该代码也可以在ClojureScript中使用。