这是从subr.el获取的短lambda宏定义。
(defmacro lambda (&rest cdr)
(list 'function (cons 'lambda cdr)))
事实上,这是一个递归宏让我解决了。有人可以解释,这是如何工作的&它返回的是什么:
(list 'function (cons 'lambda cdr))
答案 0 :(得分:4)
这不是递归宏的原因是function
的作用类似于quote
,因为它阻止了对其参数的评估。因此,不会对lambda
宏进行递归调用。
function
和quote
之间的区别在于function
允许对其参数进行字节编译,而quote
始终保持逐字保存。因此,如果您编写(lambda () 1)
,它将扩展为(function (lambda () 1))
,然后由编译器替换为字节代码。
答案 1 :(得分:2)
它不是递归宏。 Emacs Lisp宏的格式为(SYMBOL...)
。只有这样一种形式被定义为一个宏,并被扩展。不扩展宏定义主体中符号lambda
的出现。它是一个(
后跟符号lambda
和一个可能为空的性别列表,然后是匹配和展开的)
。
宏扩展返回列表(function (lambda CDR))
,其中CDR
是作为args传递给宏的(未评估的)sexps列表。当评估列表时,它返回列表(lambda CDR)
,具有相同(未评估的)CDR。