前几天这里有个讨论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提供的一种模板操作工具,只不过语法简单了一点
是可以省略的,` 做到的就是括号里面可以正常求值,是不好理解,要是和宏的求值顺序连在一起就更难了,多想想就可以了。