在Emacs Lisp中使用eval-after-load和评估顺序

时间:2015-11-08 08:23:41

标签: emacs elisp

鉴于以下情况:

(with-eval-after-load 'python
  exp1
  )

(with-eval-after-load 'python
  exp2
  )

exp2加载python模式后,exp1是否可以保证评估?

如果这两个with-eval-after-load位于不同的文件中,并且file2包含exp2需要file1包含exp1,该如何?

1 个答案:

答案 0 :(得分:2)

简短的回答是,它们的评估方式与评估eval-after-load表格的顺序相同。

如果每个eval-after-load只评估一次,那么您需要知道的全部内容。否则可能会引起一些额外的细节......

如果'python尚未provide d,则exp1exp2的评估顺序(再次)严格按照其eval-after-load的顺序{评估{1}}表格;但更具体地说,它是首先评估的顺序。如果这些eval-after-load表单中的任何一个被评估多次次(但仍然在加载相关库之前),那么这个事实对exp1的最终评估没有影响和exp2 - 每个评估一次,按顺序。

如果'python 已经已经provide,那么行为就不同了:而不是延迟评估,会立即评估子表达式 (即表单实际上等同于progn),这意味着如果多次评估任何eval-after-load表单,他们的子表单也将被多次评估。

  

如果这两个with-eval-after-load位于不同的文件中,并且file2包含exp2需要file1包含exp1,该如何?

如果先加载file2file2 加载 file1,则取决于eval-after-loadfile2是否file1之前加载exp2(在这种情况下file1首先发生),或之后加载exp1(在这种情况下{先发生{1}}。

所有这一点中的一个小好奇心是库中provide表达式的位置似乎不会影响问题。出于eval-after-load的目的,事情看起来好像provide始终位于库的最末端(事实上通常是这样),即使事实并非如此。我想这可以确保使用特征符号或库名称作为eval-after-load参数之间的一致性,但我不确定它为什么以这种方式工作的细节(因为粗略地看一下{{的代码) 1}}表明它可以直接调用provide功能。)

n.b。 after-load是根据with-eval-after-load定义的,这就是我在这个答案中使用后者的原因。答案同样适用,无论您使用哪种。

如果它有所作为,我现在正在使用Emacs 24.5.1。