2012-11-18 21 views
5

with-current-buffer'un bu makro tanımını temel alan bir makro tanımlamaya karar verdiğim için aynı (with-current-buffer .... tekrarlama kodumda bir trend fark ettim. Bu, şu ana kadar yaptığım şudur:Yapılandırılmamış defmacro'nun gövdesi

(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)))) 

bu vücut o defun yerine defmacro mükemmel çalışır olduğunu geçiş oluyor ancak ne zaman yürütülmektedir asla. Yani dışında neden hiçbir zaman çalıştırılmamış, diğer sorum - bu bir defun'dan daha mantıklı mıdır?

+0

Emacs-23'ün 'Ch f switch-to buffer 'komutunu vermek için:" UYARI: Bu, bir Lisp programında geçici olarak başka bir arabelle çalışma yönteminin DEĞİLDİR! Bunun yerine, "set-buffer" komutunu kullanın. Bu, karmaşasını engeller. pencere tampon yazışmaları ile " – Stefan

cevap

4

Unutmayın, bir makro kod üretir. Makronuz göründüğü gibi değil. Örnek çağrının bir makro genişlemesine bakın. Bir makroda hata ayıklamanın ilk adımı, bazı kodların makro genişlemesini kontrol etmektir.

....

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

Üstü: neden bu makro kod olarak değil, olduğu gibi kaynak kodu nedir? Makro genişletildiğinde bu kod çalıştırılacak, oluşturulan kodda görünmeyecektir. Muhtemelen geri almak istersiniz.

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

    `(progn ,@body) 

Yukarıda: İstediğinizi yapmayacaksınız. Oluşturmak istediğiniz TÜMÜNÜ GEREKTİRİN - sadece bu formu değil.

+0

Tüm şeyi geri aldım ve bu daha mantıklı. Teşekkürler! –

+1

Dan: Ayrıca, byte derlenmiş elisp için, makrolar derleme zamanında genişletilir ve bu nedenle, makro tarafından çalıştırılan kod, bayt derlenmiş kodu çalıştırırken çalışma zamanında yürütülmez. (Bu kritik nüansın kaçırılması kolaydır, çünkü derlenmemiş kod için makro dinamik olarak genişletilir ve * her zaman * kodu çalıştırılır.) – phils