我注意到我的代码中反复重复相同(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))))
这个主体永远不会被执行,但是当它切换到defun
而不是defmacro
时,它确实可以正常工作。除了为什么身体永远不会被执行之外,我的另一个问题是 - 这是一个宏而不是defun更有意义吗?
答案 0 :(得分:4)
请记住,宏会生成代码。你的宏看起来不像。查看示例调用的宏扩展。调试宏的第一步是检查某些代码的宏扩展。
...
(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)
上图:这不会做你想要的。您需要反选所有要生成的代码 - 而不仅仅是这种形式。