eval-after-load FROM参数前的引号是干什么的?

我看到with-eval-after-load和eval-after-load的实例里,都有FROM参数前加引号和不加引号的,那个引号有什么用? 引号:

(eval-after-load 'foo
  '(bar))

不加引号:

(eval-after-load 'foo
  (bar))

Update 不好意思整错了……

这是backquote吧……

我现在想知道的single-quote……

" “而不是” ` "

================ 不好意思原问题有个Typo……我这不认真的毛病什么时候能改改……

还有问题——应该用的是 ' (39) 不是 (8216),你可能需要关掉输入法再输入单引号。

?'
     => 39
?‘
     => 8216

我已经替你改了。

表面的作用差不多。 至于具体干什么的,没有具体例子不好判断。麻烦不要怕贴太多,直接贴整个表达式。

eval-after-load 是一个函数,函数参数位置上的表达式会在函数调用之前就计算完毕。所以想在 foo 加载之后执行 (bar) 的话,需要用:

(eval-after-load 'foo
  (quote (bar)))

等价于:

(eval-after-load 'foo
  '(bar))

事实上只要 eval-after-load 接收到 (bar)(一个列表:含一个元素,该元素为一个符号 bar)就行,所以下面这几种效果相同:

(quote (bar))
     => (bar)

'(bar)
     => (bar)

(list #'bar)
     => (bar)

((lambda () '(bar)))
     => (bar)

如果写成

(eval-after-load 'foo
  (bar))

表示立即执行 (bar),然后再把它的返回值传递给 eval-after-load。加不加引号是完全不同的意思。

其实就是我在群里问的关于chinese-pyim的那个傻问题。

所以如果我想在chinese-pyim加载之后加载(chinese-pyim-basedict-enable) 我就应该写成如下形式:

(with-eval-after-load 'chinese-pyim
  '(chinese-pyim-basedict-enable))

那么, 我看到很多配置(尤其是用diminish的时候)也会写成不加single-quote的形式, 比如purcell的配置里就有大量的这种代码:

(with-eval-after-load 'company
  (diminish 'company-mode "CMP"))

那么这种代码是为了达到什么效果?既然是立即执行,那为啥还要after-load ?

还有,with-eval-after-loadeval-after-load对single-quote的处理是否相同?

谢谢各位!

=================

此贴可以关了…… 实际上不加single-quote的写法在purcell那里也是不存在的……一切都是因为我只抄了别人的代码就用却连看都不看……

(if (fboundp 'with-eval-after-load)
    (defalias 'after-load 'with-eval-after-load)
  (defmacro after-load (feature &rest body)
    "After FEATURE is loaded, evaluate BODY."
    (declare (indent defun))
    `(eval-after-load ,feature
       '(progn ,@body))))

最后一行那个大大的quote我愣是瞪眼睛也看不见…… 所以这回完全是我的锅……总之也算是个教训吧……

该主题在创建20小时后自动关闭。不再允许新的回复。