Clojure:从符号列表中定义多方法?

时间:2014-01-12 15:14:59

标签: clojure multimethod

在我正在进行的Clojure练习中,我有几个多方法,所有这些方法都只使用identity作为调度函数。例如:

(defmulti amount identity)
(defmulti bottles identity)
(defmulti pronoun identity)
(defmulti action identity)
(defmulti pred identity)

由于所有这些函数都使用相同的identity函数进行调度,因此我想迭代这些名称并为每个名称调用defmulti,而不是重复defmulti次调用。我试过这个:

(doseq [m '(amount bottles pronoun action pred)]
  (defmulti m identity))

然而,当我这样做时,似乎defmulti没有正确的效果,就像我后来对任何多方法名称使用defmethod时,我得到一个错误,例如: / p>

(defmethod amount 0 [n] "whatever")

CompilerException java.lang.RuntimeException: Unable to resolve symbol: amount in this context, compiling:(NO_SOURCE_PATH:1:1)

是否可以迭代一个符号或名称列表,并为每个符号或名称调用defmulti,如果是,怎么办呢?

1 个答案:

答案 0 :(得分:6)

您可以创建一个包裹defmulti并执行所需操作的宏:

(defmacro defidmulti [names]
  `(do ~@(for [m names]
           `(defmulti ~m identity))))

(defidmulti [amount bottles pronoun action pred])