“什么是”呢;“加载后进行评估”;在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中。@Drew
with eval after load
安排对正文进行字节编译,而
eval after load
则没有。这就是它被添加的主要原因,iirc。@lunaryorn:啊,是的,这是有道理的。(虽然通常情况下,正文并不能从编译中受益匪浅。字节编译也不一定会带来“更好的行为”。)另一个重要区别是(根据微不足道的文档),宏显然会在每次加载
库时对
正文
进行评估。(不这样做是
eval after load
的目标之一)@lunaryorn:我错了,每次评估
BODY
都是不同的。另一方面,with eval after load的语义有细微的不同:您不能(可靠地)在with eval after load'foo
块中调用在包
foo
中定义的宏。