Common Lisp 中是否有必要使用 lambda 符号?

CRE*_*888 2 lambda common-lisp anonymous-function

我最近一直在读 Paul Graham 的 ANSI Common Lisp,他在其中提到

在 Common Lisp 中,您可以将函数表示为列表,但它们在内部表示为不同的函数对象。所以 lambda 不再是真正必要的。

在第 2 章中。但是,如果我省略 lambda 符号,我将无法编译正确的程序。

我尝试计算 Lisp 函数:(((x) x) 1 )而不是((lambda (x) x) 1 ),这应该与 ANSI Common Lisp 所说的相同。但是,没有 lambda 的代码无法编译。

Sha*_*awn 5

ACL 第 2 章的完整部分,可在 Paul Graham关于该书的网页上找到。

什么是拉姆达?
lambda 表达式中的 lambda 不是运算符。它只是一个符号。[3] 在 Lisp 的早期方言中,它有一个目的:函数在内部表示为列表,区分函数和普通列表的唯一方法是检查第一个元素是否是符号 lambda。
在 Common Lisp 中,您可以将函数表示为列表,但它们在内部表示为不同的函数对象。所以 lambda 不再是真正必要的。要求函数表示为不会有不一致之处

((x) (+ x 100))  
Run Code Online (Sandbox Code Playgroud)

代替

(lambda (x) (+ x 100))
Run Code Online (Sandbox Code Playgroud)

但 Lisp 程序员习惯于用符号 lambda 来开始函数,因此 Common Lisp 为了传统而保留了它。

(强调是后加的)。

他在这里假设性地谈论该语言如何使用不同的语法来定义函数,而不是lambda像它那样使用。正如 Will 在评论中提到的,至少另一种 Lisp 方言确实接受 -lesslambda形式。然而 Common Lisp 需要它。