# 10.2.7 特殊表达式（DONE）

特殊表达式通常是基础函数，因此**其参数可能，也可能不会被求值**。大多数的特殊表达式有它们自己的控制结构，变量绑定，这是常规函数无法做到的。

每个特殊表达式都有它们自己的求值规则，甚至有些参数是否求值，取决于另一个参数的求值结果。

如果非空列表的第一个符号被解释为特殊表达式，那么这个列表会被按照该特殊表的规则进行求值；如果没有特殊表达式，Emacs 的行为将无法被良定义（即便不会出现数学上的冲突）。举个例子，((lambda (x) x . 3) 4) 包含了一个子表达式，这个子表达式以 lambda 开头，但并不是一个良定义的 lambda 表达式，因此 Emas 可能会抛出错误，也可能会返回 3， 或 4 或 nil，或者出现其他意想不到的行为。

Function: special-form-p object

这个谓语测试了参数object是否为特殊表达式，如果是则返回 t，否则返回 nil。

这里有一个依照字母顺序排列的表，列举了 Emcas Lisp 中所有的特殊表达式。

`and`

see [Combining Conditions](https://www.gnu.org/software/emacs/manual/html_node/elisp/Combining-Conditions.html)

`catch`

see [Catch and Throw](https://www.gnu.org/software/emacs/manual/html_node/elisp/Catch-and-Throw.html)

`cond`

see [Conditionals](https://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html)

`condition-case`

see [Handling Errors](https://www.gnu.org/software/emacs/manual/html_node/elisp/Handling-Errors.html)

`defconst`

see [Defining Variables](https://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Variables.html)

`defvar`

see [Defining Variables](https://www.gnu.org/software/emacs/manual/html_node/elisp/Defining-Variables.html)

`function`

see [Anonymous Functions](https://www.gnu.org/software/emacs/manual/html_node/elisp/Anonymous-Functions.html)

`if`

see [Conditionals](https://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html)

`interactive`

see [Interactive Call](https://www.gnu.org/software/emacs/manual/html_node/elisp/Interactive-Call.html)

`lambda`

see [Lambda Expressions](https://www.gnu.org/software/emacs/manual/html_node/elisp/Lambda-Expressions.html)

`letlet*`

see [Local Variables](https://www.gnu.org/software/emacs/manual/html_node/elisp/Local-Variables.html)

`or`

see [Combining Conditions](https://www.gnu.org/software/emacs/manual/html_node/elisp/Combining-Conditions.html)

`prog1prog2progn`

see [Sequencing](https://www.gnu.org/software/emacs/manual/html_node/elisp/Sequencing.html)

`quote`

see [Quoting](https://www.gnu.org/software/emacs/manual/html_node/elisp/Quoting.html)

`save-current-buffer`

see [Current Buffer](https://www.gnu.org/software/emacs/manual/html_node/elisp/Current-Buffer.html)

`save-excursion`

see [Excursions](https://www.gnu.org/software/emacs/manual/html_node/elisp/Excursions.html)

`save-restriction`

see [Narrowing](https://www.gnu.org/software/emacs/manual/html_node/elisp/Narrowing.html)

`setq`

see [Setting Variables](https://www.gnu.org/software/emacs/manual/html_node/elisp/Setting-Variables.html)

`setq-default`

see [Creating Buffer-Local](https://www.gnu.org/software/emacs/manual/html_node/elisp/Creating-Buffer_002dLocal.html)

`unwind-protect`

see [Nonlocal Exits](https://www.gnu.org/software/emacs/manual/html_node/elisp/Nonlocal-Exits.html)

`while`

see [Iteration](https://www.gnu.org/software/emacs/manual/html_node/elisp/Iteration.html)

Common Lisp note：在 GNU Emcas Lisp 和 Common Lisp 中特殊表达式有一些不同。setq，if 和 catch 是两者中都有的特殊表达式。但 save-excursion 是 Emcas Lisp 中独有的特殊表达式；throw 是 Common Lisp 中特有的特殊表达式（因为 Common Lisp 允许抛出多个值，而Emcas Lisp 中没有这个概念）


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://emacs-lisp.ivory.cafe/qiu-zhi/biao-da-shi/10.2.7-te-shu-biao-da-shi-done.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
