lambda macro in elisp



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

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

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

(list 'function (cons 'lambda cdr))

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

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

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

宏扩展返回列表(function (lambda CDR)),其中CDR是作为参数传递给宏的 sexp 的(未计算的)列表。当该列表被评估时,它返回列表(lambda CDR),具有相同的(未计算的)CDR。

最新更新