2010-11-21 8 views
7

Clojure에서 def이라는 이름으로 새 매크로를 정의 할 여지가 있습니까? 내가 defmacro 원래를 :refer-clojure :exclude하려고 시도한 후 새로운 것을 편집했지만 어쨌든 내장 된 정의를 사용했습니다.Clojure에서 "def"재정의

다음 코드를 사용하여 Scheme 스타일 함수 정의 ((def (f x y) ...)(defn f [x y] ...))로 설정하려고했습니다.

(defmacro def 
    [ id & others ] 
    (if (list? id) 
     `(defn ~(first id) [[email protected](rest id)] [email protected]) 
     `(def ~id [email protected]))) 

답변

6

def은 매크로가 아니며 특별한 형태입니다. 심볼을 현재 네임 스페이스로 인턴합니다. 특별한 양식을 재정의 할 수는 없지만 가능하다면 어떻게 똑같은 행동을 취할 수 있습니까?

define 매크로는 defdefn의 기본에 작성하는 것이 가장 간단합니다. 당신이 def 단어를 사용하려는 경우, 즉

(replace-my-def-with-normal-def 

    (def x 0) 
    (def y (inc x)) 
    (def z (inc y)) 
    (def (my-func a b) (println a b)) 

) 

, 모든 모듈 래퍼 replace-my-def-with-normal-def을 쓸 수 있지만, defn 그것을 (예를 들어 def에 따라 다른 정의를 중단하지 않습니다 모르겠어요).

+4

특수 서식을 다시 정의 할 수 없습니다. –

2

특별한 형태의 이름 (if와 같은)으로 매크로를 만들 수는 있지만 도움이되지는 않습니다. 특별 양식은 매크로보다 먼저 평가되므로 매크로와 동일한 이름의 특수 양식이있는 경우 특수 양식이 항상 사용됩니다. 자세한 내용은 여기 http://clojure.org/evaluation.

관련 문제