`#'(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 标准之间编写的代码,或者由记得的人编写的代码那个时候,可以用#'
的形式。
在 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 标准之间编写的代码,或者由记得的人编写的代码那个时候,可以用#'
的形式。