defmacro的身体没有被执行

Dan*_*nna 5 lisp emacs elisp

我已经注意到我的代码中(with-current-buffer ....一再重复相同的趋势所以我决定根据宏定义定义一个宏with-current-buffer- 这是我到目前为止:

(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))))
Run Code Online (Sandbox Code Playgroud)

它的主体永远不会被执行,但是当它被切换到defun而不是defmacro完全可行时.所以除了为什么身体永远不会被执行之外,我的另一个问题是 - 作为一个宏而不是一个定义会更有意义吗?

Rai*_*wig 4

请记住,宏生成代码。你的宏看起来好像没有。查看示例调用的宏扩展。调试宏的第一步是检查某些代码的宏扩展。

....

(with-current-buffer (get-buffer-create asm-buffer-name)
Run Code Online (Sandbox Code Playgroud)

上图:为什么这是宏中的代码而不是源代码?该代码将在宏展开时执行,它不会出现在生成的代码中。您可能想反引用它。

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

   `(progn ,@body)
Run Code Online (Sandbox Code Playgroud)

上图:这不会达到你想要的效果。您需要对要生成的所有代码进行反引号 - 而不仅仅是此表单。