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
宏进行递归调用。
function
和 quote
之间的区别在于 function
允许对其参数进行字节编译,而 quote
始终逐字保存。因此,如果你写 (lambda () 1)
,它将被扩展为 (function (lambda () 1))
,然后由编译器替换为字节码。
这是取自 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
宏进行递归调用。
function
和 quote
之间的区别在于 function
允许对其参数进行字节编译,而 quote
始终逐字保存。因此,如果你写 (lambda () 1)
,它将被扩展为 (function (lambda () 1))
,然后由编译器替换为字节码。