2

不管争论是什么,它似乎根本没有做任何事情。它也不会以任何方式影响字节编译警告。如果根据其描述使用。有没有如何使用它的例子?

例如,下面的代码:

(defmacro deflocal (var &rest body)
  (let ((symb var)
        (val (car body))
        (doc (cadr body)))
    `(progn
       (let ((byte-compile-warnings nil))
       ;; (byte-compile-disable-warning 'make-local)
       (set (make-local-variable ',symb) ,val)
       (put ',symb 'variable-documentation ,doc)
       ;; (byte-compile-enable-warning 'make-local)
       ))))

可以为所欲为byte-compile-warnings,并且不会以任何方式影响编译器的输出(我仍然收到有关分配给自由变量的警告。

编辑:

因为这在我上面的描述中是不透明的。这就是为什么我不想使用defvar. 我有一个交互式函数,它将启动某种交互式 shell,用于与 Emacs 外部的程序进行通信。这个 shell 可以由用户直接启动,也可以在进入几种不同的主要模式或执行一些其他任务(如编译、检查语法等)时间接启动。该系统相当复杂。

我多次遇到某些函数最终可能会在我不想要的缓冲区中设置变量。例如,当编译钩子调用一个假设它在拥有连接对象的缓冲区中被调用的函数时。连接可能会失败,因此系统会尝试自动恢复连接,一旦它发现由于任何原因失败(不幸的是,我必须连接的另一个程序非常不稳定并且它的通信设施实现不佳) . 因此,例如,如果 flymake 进程突然意识到它需要恢复连接,它将在 flymake 那时所在的任何缓冲区中创建它。同样,编译模式缓冲区、完成缓冲区、帮助缓冲区等。在这些背景变化之后很难理解

现在,当我可以确定没有其他缓冲区会意外声明变量来引用连接对象,否则它会出错,我很安全,并且很容易调试和解决出现的问题。但是,一旦我使用defvar,过了一段时间我意识到已经创建了一些胭脂重复的进程,我完全不知道是谁做的。

4

2 回答 2

5

确实,byte-compile-warnings不做你想做的事。相反,您可能希望在(defvar <VAR>)某处声明您的变量,或者将触发警告的代码包装在with-no-warnings.

代码中的 let-bindingbyte-compile-warnings将在代码运行时应用,而不是在编译时应用。


编辑:

这是一个简单的测试,可以确信defvar仅使用一个参数不会将变量绑定到任何地方,如下所述

(defvar foo)
(boundp 'foo) ;; -> nil

(defvar bar t)
(boundp 'bar) ;; -> t
于 2012-11-16T17:02:29.267 回答
3

该变量byte-compile-warnings最好用作文件局部变量,以控制批量编译期间输出的警告。

听起来您担心使用的副作用, defvar但它只创建一个动态绑定的全局变量(除非该变量已经在本地绑定)。

创建局部变量后,您可以make-local-variable 在函数中使用,使变量缓冲区对于 当前缓冲区是本地的,但对于所有其他缓冲区保持全局。因此,如果您只调用make-local-variable一次,则该变量将只有两个副本,一个是动态绑定并与所有缓冲区共享的,另一个是特定于单个缓冲区的。 强调文本 (make-local-variable VARIABLE)

Make VARIABLE have a separate value in the current buffer.
Other buffers will continue to share a common default value.

如果您想确保没有变量的全局版本,您应该查看 lexical binding

最后,为了在批量编译此.el 文件时消除警告,请将以下代码放在文件底部:

;; Local Variables:
;; byte-compile-warnings: (not free-vars)
;; End:
于 2012-11-16T18:45:04.690 回答