【问题标题】:Clojure: Define multimethods from list of symbols?Clojure:从符号列表中定义多方法?
【发布时间】: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


【解决方案1】:

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

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

(defidmulti [amount bottles pronoun action pred])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    相关资源
    最近更新 更多