在以下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>
答案 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.