截至2021年,所有常见的lisp特殊功能是什么?
特殊函数之所以得此名,是因为它们不同于宏和普通函数。
就像宏一样,特殊函数不评估它们的输入。但与宏不同的是,它们不返回要计算的 Lisp 表达式。特殊函数提供了构建 Lisp 的原语,例如赋值、条件和块结构。
1989 年 [1],David S. Touretzky 写道,共有24 个内置的 Common Lisp特殊函数:
BLOCK,CATCH,COMPILER-LET,DECLARE,EVAL-WHEN,FLET,FUNCTION,GO,IF,LABELS,LET,LET*,MACROLET,MULTIPLE-VALUE-CALL,MULTIPLE-VALUE-PROG1,PROGN,PROGV,QUOTE,RETURN-FROM,SETQ,TAGBODY,THE,THROW;- 并且,
UNWIND-PROTECT。
他还说:
这个列表可能会随着 Common Lisp 标准的未来修订而改变。
这本书在 2014 年有新版本。然而,信息保持不变。即使在 2014 年的书中,文本的开头也与 1989 年的第一版完全一样:
“截至 1989 年中期,24 个内置的 Common Lisp 特殊函数是:......”(第 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 的一些实现有一些额外的特殊运算符。
- 一个形式是一个对象意味着进行评估:一个符号,一个化合物形式或自评估对象。
- 一个化合物形式:具有一个列表操作者或λ表达式作为第一个元素:一个宏形式,函数形式,一种特殊形式或λ形式
- 一个特殊形式:的化合物的形式,其中有一个特殊的运算符作为其第一元件
- 特殊运算符:第 3.1.2.1.2.1 章中列出的符号之一
为什么本书不使用 Common Lisp 标准的术语?也许作者没有意识到这一点,或者认为更新措辞以使用标准措辞太复杂(或费力)——这可能意味着改变文本中的很多东西。
另一个有用的参考是这个 PDF 格式的标准的后期草案:草案提议的 ANSI CL 标准。该草案与已发布的标准内容基本相同,但可以免费获取。Common Lisp HyperSpec的内容也基本相同,只是形式不同。