Emacs 为什么不引用lambda?

Emacs 为什么不引用lambda?,emacs,elisp,Emacs,Elisp,我被告知我不应该引用lambda的话 (global-set-key (quote [f3]) '(lambda () (interactive) (other-window -1) )) 我尝试过,如果我不引用lambda,它同样有效 (global-set-key (quote [f3]) (lambda () (interactive) (other-window -1) )) 然而,我不明白为什么后者能起作用(而且也是首选,既然后者能起作用,为什么前者也能起作用) 如果lam

我被告知我不应该引用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)
防止我的功能被立即评估。我将lambda表达式理解为我函数的匿名版本。那么为什么不引用lambda呢

谢谢

使用
C-h f lambda

表单调用(lambda ARGS DOCSTRING交互主体) 是自我引用;计算lambda表达式的结果 是表达本身

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


表单
(lambda(…)…)
的列表文字在emacs lisp evaluator中是特殊情况,可以用作函数。这就是它工作的原因,不管您是否引用lambda表达式

如果你使用
C-hf function RET
你会得到这样的结果:
像'quote',但对于函数对象更为可取。在字节编译中,“函数”导致编译其参数quote'不能这样做
。因此,是的,
quote
的问题似乎在于它避免了字节编译。请注意,除Emacs Lisp之外的其他Lisp不一定以这种方式处理
lambda
表单。例如,您可能会在其他Lisp方言中看到,
#'(lambda…
)。在Emacs Lisp中,这与
(lambda…
)基本相同(但正如@Dirk所指出的,与
(lambda…
)不同)。顺便说一句,向量文字也是“自引用的”,因此引用它们也没有意义。不完全重复,但请参见