有人告诉我,我不应该引用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?
谢谢!
答案 0 :(得分:11)
使用C-h f lambda <RET>
:
表格的召唤(lambda ARGS DOCSTRING INTERACTIVE BODY) 是自我引用;评估lambda表达式的结果 是表达本身。
所以,这回答了这个问题,为什么你不需要引用lambda表达式。至于为什么你不应该这样做...我认为,这与字节编译有关。引用的lambda表达式只是普通数据。字节码编译器别无选择,只能将表达式作为常量列表文字包含在其输出中。另一方面,不带引号的lambda表达式可以编译为字节代码,从而加快执行速度。
格式(lambda (...) ...)
的列表文字在emacs lisp评估程序中是特殊的,可以用作函数。这就是它工作的原因,无论你是否引用lambda表达式。