2009-08-23 6 views

답변

8

당신은 매크로를 사용할 수

user=> (use 'clojure.contrib.def) 
nil 
user=> (defalias def-function defn) 
#'user/def-function 
user=> (def-function g [] 2) 
#'user/g 
user=> (g) 
2 
+3

'clojure.contrib.def'와 같은 것이 없습니다. https://groups.google.com/forum/#!topic/clojure/LhidPSlvX_Q – micrub

3

이렇게하려면 본질적으로 다른 이름으로 바꾸는 것만으로 매크로를 정확히 다시 작성해야합니다. 물론 이렇게하려면 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를 사용할 수 있습니다 :

+0

설명해 주셔서 감사합니다. –

29

가 (라인 -) 시끄러운하지만

(def #^{:macro true} case #'cond) 

작품 소리가있다!