鉴于以下情况:
(with-eval-after-load 'python
exp1
)
(with-eval-after-load 'python
exp2
)
在exp2
加载python模式后,exp1
是否可以保证评估?
如果这两个with-eval-after-load
位于不同的文件中,并且file2
包含exp2
需要file1
包含exp1
,该如何?
答案 0 :(得分:2)
简短的回答是,它们的评估方式与评估eval-after-load
表格的顺序相同。
如果每个eval-after-load
只评估一次,那么您需要知道的全部内容。否则可能会引起一些额外的细节......
如果'python
尚未provide
d,则exp1
和exp2
的评估顺序(再次)严格按照其eval-after-load
的顺序{评估{1}}表格;但更具体地说,它是首先评估的顺序。如果这些eval-after-load
表单中的任何一个被评估多次次(但仍然在加载相关库之前),那么这个事实对exp1
的最终评估没有影响和exp2
- 每个评估一次,按顺序。
如果'python
已经已经provide
,那么行为就不同了:而不是延迟评估,会立即评估子表达式 (即表单实际上等同于progn
),这意味着如果多次评估任何eval-after-load
表单,他们的子表单也将被多次评估。
如果这两个
with-eval-after-load
位于不同的文件中,并且file2
包含exp2
需要file1
包含exp1
,该如何?
如果先加载file2
,file2
加载 file1
,则取决于eval-after-load
中file2
是否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。