`#'(lambda...` 和`(lambda...` 之间有区别吗?

Is there a difference between `#'(lambda... ` and `(lambda...`?

Practical Common Lisp 中有一个带有 lambda 的 REMOVE-IF-NOT 示例:

CL-USER> (remove-if-not #'(lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)

这与以下有什么不同吗:

CL-USER> (remove-if-not (lambda (x) (evenp x)) '(1 2 3 4 5))
(2 4)

(lambda..) 值是否与引用函数形式 #'(..) 重合?在 REPL 上似乎是这样,但由于我是 Lisp 的新手,我可能会忽略一些东西(而且我肯定是用词错误,所以也请纠正我)。

如您所料,这两件事是相同的:

  • #'为读宏,#'x读为(function x)。所以 #'(lambda (...) ...) 读作 (function (lambda (...) ...)),其中 function 是 CL 中的特殊运算符,表示它的参数表示一个函数;
  • lambda被定义为一个宏:(lambda (...) ...)的扩展是(function (lambda (...) ...):与前一个相同的形式。

这意味着#'(lambda (...) ...)(lambda (...) ...)(function (lambda (...) ...))在CL中都是一样的:它们都表示当前词法环境中(lambda (...) ...)指定的函数.

人们可能仍然使用 #'(lambda (...) ...) 版本的原因有两个:

  • 一致性——你需要,例如 #'foo 如果 foo 是一个函数,那么在 lambda 的情况下也使用它可能会被视为更一致;
  • 在 CL 中并不总是如此 lambda 具有现在的宏定义,因此在原始 CL 规范和 ANSI 标准之间编写的代码,或者由记得的人编写的代码那个时候,可以用#'的形式。