2012-11-18 3 views
5

저는 (with-current-buffer ....을 반복해서 반복하는 경향이있어서 with-current-buffer이라는 매크로 정의를 기반으로 매크로를 정의하기로 결정했습니다. 이것이 제가 지금까지 가지고있는 것입니다.defmacro의 본체가 실행되고 있지 않습니다

(defmacro with-assembla-buffer(asm-buffer-name heading-str &rest body) 
    "Create buffer with name of ASM-BUFFER-NAME, or uses it if exists,                          
    preps it with readonly/erase/heading - executes `body' - then puts                          
    readonly back on, goes to beginning of buffer, and switches to it." 
    (with-current-buffer (get-buffer-create asm-buffer-name) 
    (assembla-mode) 
    (toggle-read-only -1) 
    (erase-buffer) 
    (insert (format "-- %s --------------------" heading-str)) 
    (newline) 
    `(progn ,@body) 
    (toggle-read-only 1) 
    (goto-char (point-min)) 
    (switch-to-buffer (current-buffer)))) 

이의 몸이 defun 대신 defmacro 완벽하게 작동 하는가이다 전환 있어요 그러나 때, 실행되고 있지 않습니다. 그래서 을 제외하고 왜 몸이 절대 실행되지 않았습니까?, 내 다른 질문은 - 입니다. 이것은 defun보다 매크로로 더 이해가됩니까?

+0

이맥스-23의 '채널 F 스위치 - 투 - buffer'을 인용하자면. 이것은 리스프 프로그램 내에서 다른 버퍼에 일시적으로 에서 작동하는 방법이 아니다 대신'설정 buffer'를 사용하여 그 메싱을 방지 창 버퍼 대응과 함께 " – Stefan

답변

4

매크로는 코드를 생성합니다. 매크로는 그렇지 않은 것처럼 보입니다. 예제 호출의 매크로 확장을 확인하십시오. 매크로를 디버깅하는 첫 번째 단계는 일부 코드의 매크로 확장을 확인하는 것입니다.

....

(with-current-buffer (get-buffer-create asm-buffer-name) 

위는 왜이 매크로의 코드로가 아니라 같은 소스 코드? 매크로가 확장되면이 코드가 실행되고 생성 된 코드에는 나타나지 않습니다. 당신은 아마 그것을 backquote하고 싶다.

(assembla-mode) 
    (toggle-read-only -1) 
    (erase-buffer) 
    (insert (format "-- %s --------------------" heading-str)) 
    (newline) 

    `(progn ,@body) 

위 : 원하는대로 할 수 없습니다. 이 양식뿐만 아니라 생성하려는 모든 코드를 역 인용 할 필요가 있습니다. ! 경고가 ":

+0

나는 전체를 역 인용 부호로 처리했다. 그리고 그것은 훨씬 더 의미가있다. 감사! –

+1

Dan : 바이트 컴파일 된 elisp의 경우 매크로는 컴파일시 확장되므로 매크로로 실행되는 코드는 바이트 컴파일 된 코드를 실행할 때 런타임에 실행되지 않습니다. (이 중요한 뉘앙스는 놓치기 쉽습니다. 컴파일되지 않은 코드의 경우 매크로가 동적으로 확장되고 매번 * 코드가 실행되기 때문입니다.) – phils

관련 문제