2013-07-12 2 views
7

오늘 매크로를 가지고 놀았으며 매크로 함수라는 용어가 REPL에 나타났습니다. 필자는 매크로, 컴파일러 매크로 및 독자 매크로에 익숙하지만이 매크로를 사용하지는 않았습니다.매크로 기능이란 무엇입니까?

CL-USER> (defmacro fnaa (&rest rest) `(lambda ,@rest)) 
    FNAA 

CL-USER> #'fnaa 
    #<CLOSURE (LAMBDA (&REST SB-C::ARGS) :IN MACRO-FUNCTION) {1003A6DD6B}> 

나는 '검사 fnaa이 있어요 : 나는 this from the CLHS을 읽고 있지만, 그것이 무엇과 매크로 기능의 목적을 조명

어떤 도움을 무엇을하는지 이해할 수 없었다

#<SYMBOL {1003A40A5F}> 
-------------------- 
Its name is: "FNAA" 
It is unbound. 
It a macro with macro-function: #<FUNCTION (MACRO-FUNCTION FNAA) {1003A610BB}> 
It is internal to the package: COMMON-LISP-USER 
Property list: NIL 

을 것 대단히 감사하겠습니다.

[편집] this이 기능이 확장 기능을 구현 한 것으로 보입니까? 매크로가 실제로 매크로 확장 시간 (및 코드 결과)에서 실행되는 함수이기 때문에 의미가 있습니다. 그렇다면 매크로 함수가있는 매크로의 용어가 올바른 이유는 무엇입니까?

나는 가까운 느낌하지만 난 여전히 매우 그것을 못하고

[편집 AGAIN] 좋아 그래서 definition for macro보고 내가 얻을이

macro n. 1. a macro form 2. a macro function. 3. a macro name. 

그래서 매크로 이들의 조합이고, 따라서 매크로 함수는 단지 구현 일뿐입니다?

[편집 추가] 위의 결과를 보면 CLHS entry for defmacro이 맞는 것처럼 보입니다. 아무도 내가 올바른 길을 가고 있는지, 그리고 매크로 함수없이 매크로를 가질 수 있는지를 확인해 줄 수 있겠는가? 그렇지 않다면 왜 그것이 그것이 '매크로라는 사실을 명시하고 있는지 이해할 수 없다. 매크로 함수 사용

[최종 편집] 매크로는 함수 슬롯이 매크로 함수에 바인드 된 심볼입니까? (이 표현은 내가 여기 도움으로 할 수있는 쓰레기입니다!)

CL-USER> (setf (macro-function 'jam) (lambda (x y) nil)) 

#<SYMBOL {100400317F}> 
-------------------- 
Its name is: "JAM" 
It is a global variable bound to: NIL [unbind] 
It a macro with macro-function: #<FUNCTION (LAMBDA (X Y)) {1005522FAB}> [unbind] 
It is internal to the package: COMMON-LISP-USER [export] [unintern] 
Property list: NIL 

답변

7

예 '검사, macro-function는 macroexpansion 동안 코드를 호출하고, 매크로를 구현하는 기능입니다.

my answer to another question도 참조하십시오.

+0

건배, 전에 다른 답변을 읽었지만이 작은 모험을하기 전에 그것을 이해할 수 없었다 :) 매크로 기능이없는 매크로의 개념은 그다지 이해가되지 않는다. – Baggers

+0

@Baggers : '매크로 함수가없는 매크로'는 '함수 정의가없는 함수'와 같은 의미가 있습니다. :-) – sds

+0

하하, 잘 넣어. 감사! – Baggers

관련 문제