没有初始值的defvar不定义符号

时间:2015-12-30 03:59:57

标签: emacs elisp

在以下IELM会话中显示,使用没有初始值的defvar定义变量不会定义变量的符号。 那么为什么使用没有初始值的defvar呢?它仅用于文档和/或编译器帮助吗?

ELISP> foo 
*** Eval error ***  Symbol's value as variable is void: foo
ELISP> (boundp 'foo)
nil
ELISP> (defvar foo)
foo
ELISP> (boundp 'foo)
nil
ELISP> (defvar foo t)
foo
ELISP> (boundp 'foo)
t
ELISP> 

1 个答案:

答案 0 :(得分:2)

这个语法用于告诉字节编译器一个变量存在,否则它不知道是真的,从而避免编译警告。

这在 C-h i g (elisp) Compiler Errors的手册中有所描述:

• You can tell the compiler that a function is defined using
  ‘declare-function’.  *Note Declaring Functions::.

• Likewise, you can tell the compiler that a variable is defined
  using ‘defvar’ with no initial value.  (Note that this marks the
  variable as special.)  *Note Defining Variables::.

它还告诉Emacs变量使用动态绑定(即"特殊",如引用中所述)。在Emacs Lisp中,这当然是默认值;但是在已启用词法绑定的库中,即使您没有特别需要为变量赋予初始值,如果要动态绑定变量,也必须执行此操作。

defvar docstring也表示后一点: C-h f defvar

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