gpt4 book ai didi

emacs - "value returned is unused"字节编译宏时的警告

转载 作者:行者123 更新时间:2023-12-04 02:11:22 24 4
gpt4 key购买 nike

为什么对以下内容进行字节编译会产生警告?

(defmacro foomacro (shiftcode)
`(defun foo (&optional arg)
(interactive ,(concat shiftcode "p"))
(message "arg is %i" arg))
`(defun bar (&optional arg)
(interactive ,(concat shiftcode "Nenter a number: "))
(message "arg is %i" arg)))
;; provide backward compatibility for Emacs 22
(if (fboundp 'handle-shift-selection)
(foomacro "^")
(foomacro ""))

这是我得到的警告:

$ emacs -Q --batch --eval '(byte-compile-file "foo.el")'

In foomacro:
foo.el:1:21:Warning: value returned from (concat shiftcode "p") is unused

如果我摆脱 bar ,警告消失:

(defmacro foomacro (shiftcode)
`(defun foo (&optional arg)
(interactive ,(concat shiftcode "p"))
(message "arg is %i" arg)))
;; provide backward compatibility for Emacs 22
(if (fboundp 'handle-shift-selection)
(foomacro "^")
(foomacro ""))

我正在使用 GNU Emacs 24.2.1。

最佳答案

那是因为您忘记将宏主体包装在 progn 中:

(defmacro foomacro (shiftcode)
`(progn
(defun foo (&optional arg)
(interactive ,(concat shiftcode "p"))
(message "arg is %i" arg))
(defun bar (&optional arg)
(interactive ,(concat shiftcode "Nenter a number: "))
(message "arg is %i" arg))))

想想宏是如何工作的。当您调用 (foomacro "...") ,lisp 引擎识别出 foomacro是一个宏并扩展它,即在提供的参数上调用它。正如预期的那样,宏的返回值是第二个 defun形式;而第一个 defun表格是 丢弃 .然后 lisp 引擎计算返回值(即第二个 defun 形式)。因此在您的 progn仅 -less 版本 bar已定义,而不是 foo .

要理解这个过程,你需要意识到宏仅仅是“代码转换”工具;他们真的什么都不做。因此,编译器(或解释器)只能看到它们的返回值。

关于emacs - "value returned is unused"字节编译宏时的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17073755/

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