2014-01-12 5 views
2

내가 작업하고있는 Clojure 연습에서는 여러 가지 다중 메소드가 있으며, 모두가 identity을 디스패치 함수로 사용한다. 예를 들어 : 그들 모두 파견에 대해 동일한 identity 기능을 사용하기 때문에Clojure : 기호 목록에서 다중 방법을 정의 하시겠습니까?

(defmulti amount identity) 
(defmulti bottles identity) 
(defmulti pronoun identity) 
(defmulti action identity) 
(defmulti pred identity) 

, 난 그냥 이름을 반복하고 defmulti 호출을 반복하는 대신에 각각의 이름을 defmulti를 호출하고 싶습니다. 나는 defmulti가 나중에 multimethod 이름 중 어떤 defmethod를 사용할 때와 같은 적절한 효과를 가지고 있지 않지만, 내가 같은 오류가 발생하는대로 보인다 수행 할 때, 그러나

(doseq [m '(amount bottles pronoun action pred)] 
    (defmulti m identity)) 

: 나는이 시도

(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 이상 감싸고 수행하는 매크로를 만들 수 있습니다

+1

은의 바운드 값이 그 심볼이'의 첫 번째 인수로 m'됩니다 매크로 아니다 'doseq'. 'dosq'가 실제로하는 일은 단지 다중 방법'm'을 여러 번 정의하는 것입니다. –

답변

6

: defmulti``이후

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

(defidmulti [amount bottles pronoun action pred])