当某些库可能因设计而丢失时,处理“警告:分配给自由变量”


12

我的模式的字节编译:

(defun dict-setup-expansions ()
  "Add `dict-mode' specific expansions."
  (set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))

给出警告:

Warning: assignment to free variable `er/try-expand-list'

这是正常情况,因为er/try-expand-list是在externa中定义的;库expand-region位于http://elpa.gnu.org

我的模式将扩展名注册到expand-region库,但是可以在没有expand-region模式的情况下运行我的模式。

我认为处理警告的正确方法是添加声明:

(defvar er/try-expand-list)

defvar 文档说:

The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.

我用-*- lexical-binding: t -*-。这是否意味着没有defvar变量er/try-expand-list属于词法范围,并且我有真正的错误?


2
旁注:您不应在中加引号(defvar er/try-expand-list)
JeanPierre 2016年

@JeanPierre固定。
Givenkoa

Answers:


10

没有,set并且setq不声明词法变量。只做let。如果您let在这里使用过,将会有一个错误,但这很好。该警告主要是为了在使用动态变量时出现错别字。

为了使警告消失使用defvar在你的问题,但没有引用符号。


包装成eval-when-compile多余的defvar吗?没有我没有任何警告eval-when-compile。似乎eval-when-compile是必须的,如果使用活动代码,例如(require ...)...
Givenkoa

3
包装defvar将是多余的。
lunaryorn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.