对于quote还是不理解……

前几天这里有个讨论quote的主题……我还是没弄明白:

(add-to-list 'package-archives '("melpa" . "https://elpa.emacs-china.org/melpa/"))

(add-to-list 'package-archives
             `("melpa" . "https://elpa.emacs-china.org/melpa/"))

这俩该怎么理解?

这段代码是抄的purcell的,本来这里有一个if判断:

(add-to-list 'package-archives
             `("melpa" . ,(if sanityinc/no-ssl
                              "http://melpa.org/packages/"
                            "https://melpa.org/packages/")))

那么由于我把判断给省了,是不是反引号(quote)也能换成单引号了?

Yes. It is. You can f**k around with REPL and see the results.

也就是说这里要用quote完全是因为那个判断会干扰返回值,所以要禁止求值?

[1]> (setq foo t)
T
[2]> '("123" ,(if foo "31" "23"))

*** - READ: comma is illegal outside of backquote
The following restarts are available:
ABORT          :R1      Abort main loop
Break 1 [3]> :q
[4]> `("123" ,(if foo "31" "23"))
("123" "31")
[5]> '("123" (if foo "31" "23"))
("123" (IF FOO "31" "23"))

好吧…… 感谢指导

quote 有时候挺难理解的,但有时候感觉很直观, 以 symbol 为例, lisp 的求值规则规定: 如果遇到一个符号,就将它作为变量来获取它的变量值,那如何获取一个符号本身呢? 于是 lisp 在最核心的地方引入一个 quote 操作符,就是为了获取符号本身。 其他表达式也类似。

至于反引号, 它和quote看起来相似,其实完全不一样, quote是lisp的核心底层功能,而 反引号操作符是非常高层次的操作符。

反引号操作,是lisp提供的一种模板操作工具,只不过语法简单了一点

是可以省略的,` 做到的就是括号里面可以正常求值,是不好理解,要是和宏的求值顺序连在一起就更难了,多想想就可以了。