有什么区别
(function (lambda ...))
和
(lambda ...)
和
'(lambda ...)
?
在很多情况下,似乎有三种可以互换.
它们很可以互换.答案是function
使 lambda能够进行字节编译,而其他两个则不能(并且是等效的). 注意:这并不意味着function
实际上是字节编译lambda.
怎么可能弄明白呢?一点点Emacs lisp内省提供了一些线索.开始C-h f function RET::
函数是'C源代码'中的一种特殊形式.
(功能arg)
像'quote',但是对于作为函数的对象更喜欢.在字节编译中,'function'导致其参数被编译.'引用'不能那样做.
好了,这之间的区别(function (lambda ...))
和'(lambda ...)
,第一个告知字节编译器,它可以安全地编译表达式.而'ed表达式可能不一定被编译(因为它们可能只是一个数字列表.
裸露(lambda ...)
怎么样? C-h f lambda RET说明:
lambda是`subr.el'中的Lisp宏.
(lambda args [docstring] [interactive] body)
返回一个lambda表达式.表单调用(lambda args docstring交互主体)是自引用的; 评估lambda表达式的结果就是表达式本身.然后可以将lambda表达式视为函数,即存储为符号的函数值,传递给'funcall'或'mapcar'等.
因此,(lambda ...)
和'(lambda ...)
是等价的.
此外,还有一种符号#'(lambda ...)
,它是语法糖(function (lambda ...))
.
有关Emacs lisp中函数的更多信息,请阅读函数信息页面.
只需检查所有这些,您可以在*scratch*缓冲区中键入以下内容并评估表达式:
(caddr '(lambda (x) (+ x x))) (+ x x) (caddr (lambda (x) (+ x x))) (+ x x) (caddr (function (lambda (x) (+ x x)))) (+ x x) (equal '(lambda (x) (+ x x)) (function (lambda (x) (+ x x)))) t (equal '(lambda (x) (+ x x)) (lambda (x) (+ x x))) t
因此,使用lambda的所有三种变体只构建可用作函数的列表(其中一个可以是字节编译的).