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

Jas*_*ele 2 clojure multimethod

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

(defmulti amount identity)
(defmulti bottles identity)
(defmulti pronoun identity)
(defmulti action identity)
(defmulti pred identity)
Run Code Online (Sandbox Code Playgroud)

由于它们都使用相同的identity函数进行调度,我想迭代名称并调用defmulti每个名称而不是重复defmulti调用.我试过这个:

(doseq [m '(amount bottles pronoun action pred)]
  (defmulti m identity))
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做时,似乎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)
Run Code Online (Sandbox Code Playgroud)

是否有可能迭代一个符号或名称列表并调用defmulti它们中的每一个,如果是这样,它怎么能完成?

Ank*_*kur 6

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

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

(defidmulti [amount bottles pronoun action pred])
Run Code Online (Sandbox Code Playgroud)