Frage Defacro-Körper wird nicht ausgeführt


Ich habe einen Trend in meinem Code zur Wiederholung der gleichen bemerkt (with-current-buffer .... immer wieder und so entschied ich mich, ein Makro basierend auf dieser Makrodefinition zu definieren with-current-buffer - das habe ich bisher:

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

Der Körper davon wird niemals ausgeführt, wenn er jedoch eingeschaltet wird defun Anstatt von defmacro Es funktioniert perfekt. Also abgesehen von Warum wird Körper niemals ausgeführt?Meine andere Frage ist - macht das als Makro mehr Sinn als als defun?


5
2017-11-18 21:51


Ursprung


Antworten:


Denken Sie daran, ein Makro generiert Code. Ihr Makro sieht nicht so aus. Überprüfen Sie eine Makroerweiterung eines Beispielanrufs. Der erste Schritt beim Debuggen eines Makros besteht darin, die Makroexpansion eines Codes zu überprüfen.

....

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

Oben: Warum ist das als Code im Makro und nicht als Quellcode? Dieser Code wird ausgeführt, wenn das Makro erweitert wird. Es wird nicht im generierten Code angezeigt. Wahrscheinlich möchtest du es rückbuchen.

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

   `(progn ,@body)

Oben: Das wird nicht tun, was du willst. Sie müssen ALLEN Code, den Sie generieren möchten, zurücksetzen - nicht nur dieses Formular.


4
2017-11-18 21:57