什么是两者之间的区别?
(function (lambda ...))
并且
(lambda ...)
和
'(lambda ...)
它们在很多情况下似乎是可以互换的。
什么是两者之间的区别?
(function (lambda ...))
并且
(lambda ...)
和
'(lambda ...)
它们在很多情况下似乎是可以互换的。
function
使lambda表达式能够被字节编译,而另外两个则不行(并且等效)。注意:这并不意味着function
实际上会字节编译lambda表达式。好的,这就是function是'C源代码'中的特殊形式。
(function arg)
像'quote'一样,但更适用于函数对象。在字节编译中,'function'使其参数被编译。'quote'无法做到这一点。
(function (lambda ...))
和'(lambda ...)
之间的区别,前者告诉字节编译器可以安全地编译表达式。而'修饰的表达式可能不一定被编译(因为它们可能只是数字列表)。(lambda ...)
呢?C-h f lambda RET显示:
因此,lambda是`subr.el'中的Lisp宏。
(lambda args [docstring] [interactive] body)
返回一个lambda表达式。调用形式(lambda args docstring interactive body)是自引用的;求值lambda表达式的结果就是表达式本身。然后可以将lambda表达式视为函数,即存储为符号的函数值,传递给'funcall'或'mapcar'等。
(lambda ...)
和'(lambda ...)
是等效的。#'(lambda ...)
,它是(function (lambda ...))
的语法糖。(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
好的,(quote (lambda...))
和(lambda...)
在字节编译时并不等效。引用的lambda表达式不会被字节编译,而其他所有内容都会被编译。
例如:
(defun foo (a)
(byte-code-function-p a))
(defun bar ()
(foo '(lambda () (ignore 'me))))
(defun bar2 ()
(foo (lambda () (ignore 'me))))
(defun bar3 ()
(foo (function (lambda () (ignore 'me)))))
(defun bar4 ()
(foo #'(lambda () (ignore 'me))))
(byte-compile 'bar)
(byte-compile 'bar2)
(byte-compile 'bar3)
(byte-compile 'bar4)
(bar) ; -> nil
(bar2) ; -> t
(bar3) ; -> t
(bar4) ; -> t
通常情况下,你不需要引用lambda函数,除非你要将其传递给的函数与仅调用(funcall)它有所不同。
(function(lambda ...))
是(quote(lambda ...))
的一个变体,它使得字节编译成为可能。(b)未引用的(lambda ...)
现在与(function(lambda ...))
相同! - phils
(lambda ...)
实际上等同于(function (lambda ...))
,而不是'(lambda ...)'
,你可以通过评估(macroexpand (lambda (x) (+ x x)))
来尝试。 - nschum(macroexpand '(lambda (x) (+ x x)))
- 同样的事情。我相信我在我的答案中已经涵盖了这一点(请参见倒数第二个equal
语句)。 - Trey Jackson(macroexpand '(lambda ...))
与(macroexpand''(lambda ...))
。 你的结论不受影响,因为function
和quote
都被实现为return Fcar(args);
并且实际上只是给编译器的提示。 但是lambda确实返回了function
提示。 - nschum(lambda ...)
现在等同于(function (lambda ...))
而不是(quote (lambda ...))
。 - undefined