elisp 中的 lambda 宏

lambda macro in elisp

这是取自 subr.el 的简短 lambda 宏定义。

  (defmacro lambda (&rest cdr)
      (list 'function (cons 'lambda cdr)))

事实上,这是一个递归宏,这让我陷入了困境。有人可以解释一下,这是如何工作的以及它是什么 returns:

(list 'function (cons 'lambda cdr))

它不是递归宏。 Emacs Lisp 宏具有 (SYMBOL...) 的形式。只有这样一种形式才被定义为宏,并被扩展。宏定义体中出现的符号 lambda 不展开。它是一个 ( 后跟符号 lambda 和一个可能为空的 sexps 列表,然后是匹配和扩展的 )

宏扩展 returns 列表 (function (lambda CDR)),其中 CDR 是作为参数传递给宏的 sexps 的(未评估的)列表。当 list 被评估时,它 returns 列表 (lambda CDR),具有相同的(未评估的)CDR。

这不是递归宏的原因是 function 的行为类似于 quote,因为它阻止对其参数求值。因此,不会对 lambda 宏进行递归调用。

functionquote 之间的区别在于 function 允许对其参数进行字节编译,而 quote 始终逐字保存。因此,如果你写 (lambda () 1),它将被扩展为 (function (lambda () 1)),然后由编译器替换为字节码。