2014-01-12 37 views
2

在我正在進行的Clojure練習中,我有幾種多方法,所有這些都只是使用identity作爲調度功能。例如:Clojure:從符號列表中定義multimethods?

(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,如果是的話如何實現?

+1

由於'defmulti'是一個宏它被符號'M'作爲第一個參數,而不是在綁定的值'doseq'。 'doseq'實際上正在做的是多次定義多方法'm'。 –

回答

6

您可以創建一個包裝過defmulti並做必要的事情宏:

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

(defidmulti [amount bottles pronoun action pred])