gpt4 book ai didi

emacs - defmacro 的主体未被执行

转载 作者:太空宇宙 更新时间:2023-11-03 18:38:29 25 4
gpt4 key购买 nike

我注意到我的代码中有一种趋势,就是一遍又一遍地重复相同的 (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 时,它确实可以完美地工作。因此,除了为什么 body 从未执行过,我的另一个问题是 - 作为宏是否比 defun 更有意义?

最佳答案

请记住,宏会生成代码。您的宏看起来不像。查看示例调用的宏扩展。调试宏的第一步是检查一些代码的宏扩展。

....

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

上图:这不会做你想做的。您需要反引号所有要生成的代码 - 不仅仅是这个表单。

关于emacs - defmacro 的主体未被执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13445008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com