如何在clojure中编写变量defmulti/defmethod

如何在clojure中编写变量defmulti/defmethod,clojure,polymorphism,variadic,Clojure,Polymorphism,Variadic,我有一个defmulti/defmethod组,它接受成对的参数,比如 (defmulti foo "some explanation" (fn [arg1 arg2] (mapv class [arg1 arg2]))) (defmethod foo [N P] (->L 1 2 3)) (defmethod foo [L P] (->N 5)) (defmethod foo [P N] (->L 6 7 8)) ... 以您可能期望的方式调用 (foo (->N

我有一个defmulti/defmethod组,它接受成对的参数,比如

(defmulti foo "some explanation" (fn [arg1 arg2] (mapv class [arg1 arg2])))
(defmethod foo [N P] (->L 1 2 3))
(defmethod foo [L P] (->N 5))
(defmethod foo [P N] (->L 6 7 8))
 ...
以您可能期望的方式调用

(foo (->N 9) (->P 9))
我想用两个以上的参数来调用'foo'。 我知道如何使用函数实现这一点,我想我可以使用一些包装器函数,将arg拆分成对,然后组合结果(或者只使用“reduce”),但这似乎是错误的

那么我的问题是。。。
clojure中定义变量多函数的惯用方法是什么?

给出
defmulti
分派函数和
defmethod
体变量签名没有错,这是非常惯用的方法:

(defmulti bar (fn [x & y] (class x)))
(defmethod bar String [x & y] (str "string: " (count y)))
(defmethod bar Number [x & y] (str "number: " (count y)))

(bar "x" 1 2 3) ;=> "string: 3"
(bar 1 2 3) ;=> "number: 2"

就像让正则函数变为变量一样-给分派函数和
defmethod
体一个变量签名。谢谢,我刚刚发现这个。。。我用你的答案在clojuredocs中构建了一个样本。