10.2.7 特殊形式

特殊形式(special form) 是一种被特别标记的原语,使其参数不会被全部求值。大多数特殊形式用于定义控制结构或执行变量绑定 —— 这些都是普通函数无法完成的功能。

每种特殊形式都有自己的规则,规定哪些参数需要求值、哪些参数直接使用而不求值。某个参数是否会被求值,可能取决于其他参数的求值结果。

如果一个表达式的第一个符号是某种特殊形式,该表达式必须遵循该特殊形式的语法规则;否则,Emacs 的行为是未定义的(尽管程序不会崩溃)。例如,((lambda (x) x . 3) 4) 包含一个以 lambda 开头、但格式不合法的子表达式,因此 Emacs 可能会报错,也可能返回 3、4、nil,或出现其他不确定行为。

Function: special-form-p object

该谓词函数用于检查其参数是否为特殊形式:若是,则返回 t;否则返回 nil

以下是 Emacs Lisp 中所有特殊形式的列表(按字母顺序排列),并附带各特殊形式的说明文档引用位置。

and

see 条件组合结构

catch

see 显式非局部退出:catchthrow

cond

see 条件判断

condition-case

see 编写处理错误的代码

defconst

see 定义全局变量

defvar

see 定义全局变量

function

see 匿名函数

if

see 条件判断

interactive

see Interactive Call

lambda

see Lambda 表达式

let
let*

see 局部变量

or

see 条件组合结构

prog1
prog2
progn

see 顺序执行

quote

see 引用

save-current-buffer

see The Current Buffer

save-excursion

see Excursions

save-restriction

see Narrowing

setq

see 修改变量值

setq-default

see 创建与删除缓冲区局部绑定

unwind-protect

see 非局部退出

while

see 迭代

Common Lisp 注: 下面是 GNU Emacs Lisp 与 Common Lisp 中特殊形式的一些对比。setqifcatch 在 Emacs Lisp 与 Common Lisp 中都是特殊形式。save-excursion 是 Emacs Lisp 中的特殊形式,但 Common Lisp 中不存在。throw 在 Common Lisp 中是特殊形式(因为它必须能抛出多个值),但在 Emacs Lisp 中是函数(后者不支持多值)。


emacs

Emacs

org-mode

Orgmode

Donations

打赏

Copyright

© 2025 Jasper Hsu

Creative Commons

Creative Commons

Attribute

Attribute

Noncommercial

Noncommercial

Share Alike

Share Alike