이렇게하려면 본질적으로 다른 이름으로 바꾸는 것만으로 매크로를 정확히 다시 작성해야합니다. 물론 이렇게하려면 defmacro
을 사용하십시오. 이것이 매크로가 값을 반환하지 않기 때문에 가능한 유일한 방법이지만, 나중에 평가할 코드를 작성하십시오.
Def는 코드 블록이 아닌 값에 이름을 바인딩해야합니다.
(DEF 심볼 INIT는?)
만들고 인턴 또는 기호의 이름과 현재 공간의 값 (NS)의 네임 스페이스와 글로벌 VAR을 찾아. init가 제공되면 평가되고 var의 루트 바인딩이 결과 값으로 설정됩니다. init가 제공되지 않으면, var의 루트 바인딩은 영향을받지 않습니다. def은 var가 def가 호출 된 지점에서 스레드 바운드 인 경우에도 항상 루트 바인딩에 적용됩니다. def은 var 자체 (값이 아님)를 산출합니다. symbol이 이미 네임 스페이스에 있고 interned var에 매핑되지 않은 경우 예외가 발생합니다. Clojure: Special Forms
매크로에서
는 자신의 형태를 평가하지 않습니다
매크로는 구문 추상화를 허용, 양식을 조작하는 기능입니다. 호출 연산자가 매크로 함수 인 전역 변수를 명명하는 기호 인 경우 매크로 함수가 호출되고 이 전달되고 평가되지 않은 피연산자는 [기울임 꼴]입니다. 매크로의 반환 값은 그 자리에서 평가됩니다. 요컨대 Clojure: Evaluation
에서
은 매크로의 포인트 평가 지연이므로 def
는 기호에 결합하는 것은 값을 제공 할 수 없다.
user=> (defmacro def-function [& args] `(defn [email protected]))
#'user/def-function
user=> (def-function g [] 2)
#'user/g
user=> (g)
2
을 또는 당신은 clojure.contrib.def/defalias
를 사용할 수 있습니다 :
'clojure.contrib.def'와 같은 것이 없습니다. https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub