2

在我正在进行的 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用于任何多方法名称时,我收到一个错误,例如:

(defmethod amount 0 [n] "whatever")

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

是否可以遍历符号或名称列表并调用defmulti它们中的每一个,如果可以,如何完成?

4

1 回答 1

6

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

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

(defidmulti [amount bottles pronoun action pred])
于 2014-01-12T17:07:48.317 回答