9.2 定义符号

定义(definition) 是一类特殊的 Lisp 表达式,用于表明你打算以某种特定方式使用一个符号。它通常会为符号指定一种用途下的值或含义,同时附带该用法的文档说明。因此,当你将一个符号定义为变量时,可以为该变量提供初始值以及对应的文档说明。

defvardefconst 是用于将符号定义为 全局变量(global variable) 的特殊形式 —— 全局变量可在 Lisp 程序的任意位置访问。关于变量的详细说明,See 变量,可使用 defcustom 宏,它内部会调用 defvar 来完成工作(see 自定义设置)。

理论上,你可以使用 setq 为任意符号赋予变量值,无论该符号是否事先被定义为变量。但是,对于你要使用的每个全局变量,都应当编写对应的变量定义;否则,当在启用词法作用域的环境中运行时,你的 Lisp 程序可能无法正常执行(see Scoping 变量绑定的作用域规则)。

defun 将符号定义为函数 —— 它会创建一个 lambda 表达式,并将其存储到该符号的函数单元中。这个 lambda 表达式也就成为了该符号的函数定义。(“函数定义(function definition)” 这一术语指代函数单元中存储的内容,其由来正是 defun 为符号赋予了作为函数的定义。)defsubstdefalias 是另外两种定义函数的方式。See 函数

defmacro 将符号定义为宏。它会创建一个宏对象,并将其存储到该符号的函数单元中。请注意,一个符号可以是宏或函数,但不能同时兼具两者身份—— 因为宏定义和函数定义都存储在函数单元中,而该单元在任意时刻只能存放一个 Lisp 对象。参见 See

如前所述,Emacs Lisp 允许同一个符号既被定义为变量(例如通过 defvar),又被定义为函数或宏(例如通过 defun)。这类定义不会产生冲突。

这些定义同时也为编程工具提供指引。例如,C-h fC-h v 命令会生成帮助缓冲区,其中包含指向对应变量、函数或宏定义的链接。See Name Help in The GNU Emacs Manual

emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike