快速的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等......
答案 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中使用。