特殊形式(special form) 是一种被特别标记的原语,使其参数不会被全部求值。大多数特殊形式用于定义控制结构或执行变量绑定 —— 这些都是普通函数无法完成的功能。
每种特殊形式都有自己的规则,规定哪些参数需要求值、哪些参数直接使用而不求值。某个参数是否会被求值,可能取决于其他参数的求值结果。
如果一个表达式的第一个符号是某种特殊形式,该表达式必须遵循该特殊形式的语法规则;否则,Emacs 的行为是未定义的(尽管程序不会崩溃)。例如,((lambda (x) x . 3) 4) 包含一个以 lambda 开头、但格式不合法的子表达式,因此 Emacs 可能会报错,也可能返回 3、4、nil,或出现其他不确定行为。
该谓词函数用于检查其参数是否为特殊形式:若是,则返回 t;否则返回 nil。
以下是 Emacs Lisp 中所有特殊形式的列表(按字母顺序排列),并附带各特殊形式的说明文档引用位置。
andsee 条件组合结构
catchcondsee 条件判断
condition-casesee 编写处理错误的代码
defconstsee 定义全局变量
defvarsee 定义全局变量
functionsee 匿名函数
ifsee 条件判断
interactivesee Interactive Call
lambdasee Lambda 表达式
letlet*see 局部变量
orsee 条件组合结构
prog1prog2prognsee 顺序执行
quotesee 引用
save-current-buffersave-excursionsee Excursions
save-restrictionsee Narrowing
setqsee 修改变量值
setq-defaultsee 创建与删除缓冲区局部绑定
unwind-protectsee 非局部退出
whilesee 迭代
Common Lisp 注: 下面是 GNU Emacs Lisp 与 Common Lisp 中特殊形式的一些对比。
setq、if和catch在 Emacs Lisp 与 Common Lisp 中都是特殊形式。save-excursion是 Emacs Lisp 中的特殊形式,但 Common Lisp 中不存在。throw在 Common Lisp 中是特殊形式(因为它必须能抛出多个值),但在 Emacs Lisp 中是函数(后者不支持多值)。