当前位置:  开发笔记 > 开发工具 > 正文

Emacs Lisp:(function(lambda ...))和(lambda ...)之间的区别?

如何解决《EmacsLisp:(function(lambda))和(lambda)之间的区别?》经验,为你挑选了1个好方法。

有什么区别

(function (lambda ...))

(lambda ...) 

'(lambda ...)

在很多情况下,似乎有三种可以互换.



1> Trey Jackson..:

它们很可以互换.答案是function 使 lambda能够进行字节编译,而其他两个则不能(并且是等效的). 注意:这并不意味着function实际上是字节编译lambda.

怎么可能弄明白呢?一点点Emacs lisp内省提供了一些线索.开始C-h f function RET::

函数是'C源代码'中的一种特殊形式.

(功能arg)

像'quote',但是对于作为函数的对象更喜欢.在字节编译中,'function'导致其参数被编译.'引用'不能那样做.

好了,这之间的区别(function (lambda ...))'(lambda ...),第一个告知字节编译器,它可以安全地编译表达式.而'ed表达式可能不一定被编译(因为它们可能只是一个数字列表.

裸露(lambda ...)怎么样? C-h f lambda RET说明:

lambda是`subr.el'中的Lisp宏.

(lambda args [docstring] [interactive] body)

返回一个lambda表达式.表单调用(lambda args docstring交互主体)是自引用的; 评估lambda表达式的结果就是表达式本身.然后可以将lambda表达式视为函数,即存储为符号的函数值,传递给'funcall'或'mapcar'等.

因此,(lambda ...)'(lambda ...)是等价的.

此外,还有一种符号#'(lambda ...),它是语法糖(function (lambda ...)).

有关Emacs lisp中函数的更多信息,请阅读函数信息页面.

只需检查所有这些,您可以在*scratch*缓冲区中键入以下内容并评估表达式:

(caddr '(lambda (x) (+ x x)))
(+ x x)

(caddr (lambda (x) (+ x x)))
(+ x x)

(caddr (function (lambda (x) (+ x x))))
(+ x x)

(equal '(lambda (x) (+ x x))
       (function (lambda (x) (+ x x))))
t

(equal '(lambda (x) (+ x x))
       (lambda (x) (+ x x)))
t

因此,使用lambda的所有三种变体只构建可用作函数的列表(其中一个可以是字节编译的).


`(lambda ...)`实际上相当于`(function(lambda ...))`而不是`'(lambda ...)`,因为你可以通过评估`(macroexpand(lambda(x)(+)来尝试XX)))`
推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有