在elisp的lambda宏

时间:2015-01-29 16:10:19

标签: emacs elisp

这是从subr.el获取的短lambda宏定义。

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

事实上,这是一个递归宏让我解决了。有人可以解释,这是如何工作的&它返回的是什么:

(list 'function (cons 'lambda cdr))

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:2)

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

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