【发布时间】:2014-01-12 15:14:59
【问题描述】:
在我正在进行的 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,如果可以,如何完成?
【问题讨论】:
-
由于
defmulti是一个宏,它获取符号m作为它的第一个参数,而不是doseq中的绑定值。doseq实际上所做的只是多次定义多方法m。
标签: clojure multimethod