为什么不引用lambda?

时间:2014-01-06 10:49:35

标签: emacs elisp

有人告诉我,我不应该引用lambda,比如说

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

我试过,如果我不引用lambda,它同样适用

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

然而,我不明白为什么后者有效(并且也是首选,现在后者有效,为什么前者也有效)。

如果lambda表达式被定义为另一个函数,我们就会调用

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

以防止立即评估my-function。我理解lambda表达式是my-function的匿名版本。那么为什么不引用lambda?

谢谢!

1 个答案:

答案 0 :(得分:11)

使用C-h f lambda <RET>

  

表格的召唤(lambda ARGS DOCSTRING INTERACTIVE BODY)   是自我引用;评估lambda表达式的结果   是表达本身。

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

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