1

Practical Common LispREMOVE-IF-NOT中有一个使用 lambda的示例:

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 的新手,我可能会忽略一些东西(我肯定用词有误,所以也请纠正我)。

4

1 回答 1

4

正如您所怀疑的,这两件事是相同的:

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

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

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

  • 一致性——你需要,例如#'fooiffoo是一个函数,所以在这种情况下使用它可能会被视为更一致lambda
  • 在 CL 中并不总是lambda具有现在的宏定义,因此在原始 CL 规范和 ANSI 标准之间编写的代码,或者由记得那个时代的人编写的代码可以使用这种#'形式。
于 2020-12-14T12:03:50.850 回答