“什么是”呢;“加载后进行评估”;在Emacs Lisp中
在尝试从安装“什么是”呢;“加载后进行评估”;在Emacs Lisp中,emacs,macros,elisp,Emacs,Macros,Elisp,在尝试从安装persp mode时,我遇到了加载后使用eval的宏。但我无法在Emacs和/或Google上找到宏。它的定义是什么?它是标准Emacs Lisp的一部分吗?来自etc/NEWS: * Lisp Changes in Emacs 24.4 ... ** New macro `with-eval-after-load'. This is like the old `eval-after-load', but better behaved. Emacs 24.4于2014年10月20
persp mode
时,我遇到了加载后使用eval的宏。但我无法在Emacs和/或Google上找到宏。它的定义是什么?它是标准Emacs Lisp的一部分吗?来自etc/NEWS
:
* Lisp Changes in Emacs 24.4
...
** New macro `with-eval-after-load'.
This is like the old `eval-after-load', but better behaved.
Emacs 24.4于2014年10月20日发布
eval after load
被视为行为不良,因为它是一个函数,而不是宏,因此需要引用其中的代码,这意味着无法对其进行字节编译。它也只接受一个表单,因此如果有多个表单,则需要使用progn
。例如:
(eval-after-load "foo"
'(progn
(setq foo 42)
(setq bar 17)))
加载后评估的等效版本为:
(with-eval-after-load "foo"
(setq foo 42)
(setq bar 17))
如注释中所述,加载后评估
的一个缺点是,您不能依赖相关模块中定义的宏,而使用加载后评估
可以确保这些宏已定义并可供使用。这是。FWIW:如果这就是“表现更好”的全部意思,那么我会说这几乎就是虚假广告。我真诚地希望有比新闻中给出的更好的理由费心将此宏添加到Emacs中。@Drewwith eval after load
安排对正文进行字节编译,而eval after load
则没有。这就是它被添加的主要原因,iirc。@lunaryorn:啊,是的,这是有道理的。(虽然通常情况下,正文并不能从编译中受益匪浅。字节编译也不一定会带来“更好的行为”。)另一个重要区别是(根据微不足道的文档),宏显然会在每次加载库时对正文
进行评估。(不这样做是eval after load
的目标之一)@lunaryorn:我错了,每次评估BODY
都是不同的。另一方面,with eval after load的语义有细微的不同:您不能(可靠地)在with eval after load'foo
块中调用在包foo
中定义的宏。