这是取自subr.el的简短lambda宏定义。
(defmacro lambda (&rest cdr)
(list 'function (cons 'lambda cdr)))
事实上,这是一个递归宏让我陷入困境。 有人可以解释一下,这是如何工作的以及它返回的内容:
(list 'function (cons 'lambda cdr))
这不是递归宏的原因是function
的行为类似于quote
,因为它阻止了对其参数的评估。 因此,不会对lambda
宏进行递归调用。
function
和 quote
之间的区别在于,function
允许对其参数进行字节编译,而quote
始终逐字保留它。 因此,如果你写(lambda () 1)
,它将被扩展为(function (lambda () 1))
,然后由编译器替换为字节码。
它不是一个递归宏。Emacs Lisp宏的形式(SYMBOL...)
。只有这样一种形式被定义为宏,并且被扩展。 宏定义正文中符号lambda
的出现位置不会展开。 它是一个(
,后跟符号lambda
和一个可能为空的 sexp 列表,然后是一个匹配和展开的)
。
宏扩展返回列表(function (lambda CDR))
,其中CDR
是作为参数传递给宏的 sexp 的(未计算的)列表。当该列表被评估时,它返回列表(lambda CDR)
,具有相同的(未计算的)CDR。