2014-01-06 54 views
8

有人告诉我,我不应该在报价拉姆达,比方说,为什么不引用lambda?

(global-set-key (quote [f3]) '(lambda() (interactive) (other-window -1))) 

我想,的确,如果我不引用拉姆达,它同样适用

(global-set-key (quote [f3]) (lambda() (interactive) (other-window -1))) 

不过,我不不明白为什么后者会起作用(也是首选,现在后者起作用,为什么前者也起作用)。

如果lambda表达式定义为其他功能,我们会叫

(global-set-key (quote [f3]) 'my-function) 

,以防止我的功能将立即评估。我将lambda表达式理解为my函数的匿名版本。那么为什么不应该引用lambda呢?

谢谢!

+1

顺便一提,矢量文字也是“自引用”,所以没有必要引用它们。 – gsg

+1

不完全重复,但请参阅[何时应使用Emacs#的函数语法?](http://stackoverflow.com/questions/16801396/when-should-emacs-function-syntax-be-used) – phils

回答

9

使用C-h f lambda <RET>

形式(拉姆达ARGS文档字符串INTERACTIVE BODY) 是自引用的呼叫;评估lambda表达式 的结果是表达式本身。

所以,这回答了这个问题,为什么你不需要引用lambda表达式。至于你为什么不应该这样做...我认为,这与字节编译有关。引用的lambda表达式只是简单的数据。字节码编译器别无选择,只能将表达式作为常量列表文字包含在其输出中。另一方面,不加引号的lambda表达式可以编译为字节码,从而加快执行速度。

形式(lambda (...) ...)的列表文字是emacs lisp评估程序中的特殊字体,可用作函数。这就是它工作的原因,不管你是否引用lambda表达式。

+2

如果你使用'Ch f函数RET',你可以得到这个:'Like'quote',但是对于函数对象来说是首选的。在字节编译中,'函数'会导致其参数被编译。 '报价'不能这样做'。所以,是的,似乎'quote'的问题是它避免了字节编译。 – rsenna

+0

请注意,除Emacs Lisp之外的其他Lisp不一定会以这种方式处理'lambda'表单。例如,你可能会看到其他Lisp方言中的'#'(lambda ...)'。在Emacs Lisp中,这与'(lambda ...)'基本相同(但@Dirk指出,与'(lambda ...)'不同)。 – Drew