byte-compile-disable-warning有什么作用?

2 emacs elisp

无论论证是什么,它似乎都没有做任何事情.它也不会以任何方式影响字节编译警告.如果按照其描述使用.有没有如何使用它的例子?

例如,下面的代码:

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

可以做任何想做的事情byte-compile-warnings,它不会以任何方式影响编译器的输出(我仍然会收到关于赋值给自由变量的警告.

编辑:

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

我遇到过很多次,某些函数最终可能会在我不想要的缓冲区中设置变量.例如,当编译钩子调用一个函数,该函数假定它在拥有连接对象的缓冲区中被调用.连接可能会失败,因此一旦发现它因任何原因失败,系统就会尝试自动恢复连接(不幸的是,我必须连接的其他程序非常不稳定,而且其通信设施实施不当) .因此,例如,如果flymake进程突然意识到它需要恢复连接,它将在任何缓冲区flymake创建它.同样,编译模式缓冲区,完成缓冲区,帮助缓冲区等.这是非常困难的情况下的这些更改后跟随.

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

Ste*_*fan 5

的确,byte-compile-warnings不做你想做的事.相反,你可能想要用(defvar <VAR>)某个地方声明你的变量,或者包装触发警告的代码with-no-warnings.

byte-compile-warnings您的代码中的let-binding 将在代码运行时应用,而不是在编译时应用.


编辑:

下面是一个简单的测试,得到确信,使用defvar只有一个参数不变量绑定到处都是,如解释在这里:

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

(defvar bar t)
(boundp 'bar) ;; -> t
Run Code Online (Sandbox Code Playgroud)