(quote x)
使x不被评估,但在内的,
前面添加一个使其被评估。那么使用带引号的单引号前面有逗号的意义是什么?x
quote
(quote ,x)
(put (quote ,cmd) 'aa--alts ,alternatives)
为什么不(put cmd 'aa-alts ,alternatives)
一样好?
(quote x)
使x不被评估,但在内的,
前面添加一个使其被评估。那么使用带引号的单引号前面有逗号的意义是什么?x
quote
(quote ,x)
(put (quote ,cmd) 'aa--alts ,alternatives)
为什么不(put cmd 'aa-alts ,alternatives)
一样好?
Answers:
逗号用于反引号(又称准引号)列表的上下文中,该列表使您可以有选择地评估列表的某些部分。另请参见此线程以获取反引号用法的示例。
几个简单的例子:
(setq a "a's value" b "b's value" c "c's value")
'(a b c) ; => (a b c)
`(,a b ,c) ; => ("a's value" b "c's value")
您要引用的逗号在宏定义中,而宏定义又使用反引号progn
:
(defmacro add-annoying-arrows-advice (cmd alternatives)
`(progn
(add-to-list 'annoying-commands (quote ,cmd))
(put (quote ,cmd) 'aa--alts ,alternatives)
(defadvice ,cmd (before annoying-arrows activate)
(when annoying-arrows-mode
(aa--maybe-complain (quote ,cmd))))))
,cmd
反引号中的允许您将值cmd
放在适当的位置而不是符号cmd
。
(setq a "a's value" b "b's value" c "c's value")
然后评估`(a '(,b c))
。
那是因为它在宏中。宏需要返回一个Lisp表单,然后对其进行求值。
例如,查看此宏的第一次调用:
(add-annoying-arrows-advice previous-line '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))
我们需要扩展以包含:
(put 'previous-line 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))
这是(quote ,cmd)
实现的。如果宏将改用纯cmd
文本,则将其按字面意义保留,并且扩展名为:
(put cmd 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))
这是一个错误,因为cmd
未在调用宏的环境中定义。
progn
意味着无论嵌套多远,都必须在要评估的内容前面加上逗号。(这,cmd
是在另一个列表中,而不是直接在列表中(progn)
。)