截至2021年,常见的lisp特殊功能有哪些?

As of 2021, what are all common lisp special functions?

特殊函数获得此名称是因为它们不同于宏和普通函数。

就像宏一样,特殊函数不会计算它们的输入。但不像 宏,它们做的是 not return Lisp 表达式。特别的 函数提供了构建 Lisp 的原语,例如赋值, 条件和块结构。

1989 年 [1],David S. Touretzky 写道,有 24 内置的 Common Lisp 特殊函数:

  1. BLOCK,
  2. CATCH,
  3. COMPILER-LET,
  4. DECLARE,
  5. EVAL-WHEN,
  6. FLET,
  7. FUNCTION,
  8. GO,
  9. IF,
  10. LABELS,
  11. LET,
  12. LET*,
  13. MACROLET,
  14. MULTIPLE-VALUE-CALL,
  15. MULTIPLE-VALUE-PROG1,
  16. PROGN,
  17. PROGV,
  18. QUOTE,
  19. RETURN-FROM,
  20. SETQ,
  21. TAGBODY,
  22. THE,
  23. THROW;
  24. 并且,UNWIND-PROTECT.

他还说:

This list may change with future revisions of the Common Lisp standard.

这本书在 2014 年有一个新版本。但是,信息是一样的。即使在 2014 年的书中,文本的开头也与 1989 年的第一版完全相同:

"As of mid-1989, the 24 built-in Common Lisp special functions are: ...." (page 507).

不确定他们是否仔细查看了这一点,如果他们仔细查看,我猜他们会将年份更新为“截至 2014 年中... “

因此,截至 2021 年年中,该列表与 1989 年现在有什么不同吗?

来源: [1] - COMMON LISP:符号计算简介

在 Common Lisp 标准(1994 年发布)中没有特殊函数 的概念。该标准定义了 特殊运算符 的概念,并且这些不能是函数。正如 Will Ness 评论的那样, 特殊运算符 在 Common Lisp HyperSpec 中列出(这是从标准派生的 HTML 页面 - 原始标准作为印刷文档发布并且一个 PDF 文件):3.1.2.1.2.1 Special Forms。这是一个固定列表 -> 标准没有提供给 Common Lisp 用户添加新的语言机制。尽管我认为 Common Lisp 的某些实现有一些额外的特殊运算符。

  • a form 是一个 object 意味着被评估:一个符号,一个 复合形式 或自评对象。
  • a 复合形式:以运算符或lambda表达式作为第一个元素的列表:宏形式,函数形式, 特殊形式或 lambda 形式
  • a 特殊形式: 复合形式,其第一个元素为特殊运算符
  • 特殊运算符chapter 3.1.2.1.2.1
  • 中列出的符号之一

为什么本书没有使用 Common Lisp 标准的术语?也许作者没有意识到它或者认为更新措辞以使用标准措辞太复杂(或太费力)——这可能意味着改变文本中的很多东西。

另一个有用的参考是 PDF 格式的最新标准草案:draft proposed ANSI CL standard。该草案与已发布的标准内容基本相同,但可以免费获取。 Common Lisp HyperSpec也有基本相同的内容,但形式不同。