我有一个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'超过2个参数。 我知道如何使用函数执行此操作,我想我可以使用一些包装函数将args拆分成对,然后组合结果(或者只是使用' reduce')但这似乎是错误的。
我的问题是...... 在clojure中定义可变参数多功能的惯用方法是什么?
答案 0 :(得分:5)
赋予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"