单引号和逗号引号的含义是什么?(引号,arg)


15

(quote x)使x不被评估,但在内的,前面添加一个使其被评估。那么使用带引号的单引号前面有逗号的意义是什么?xquote(quote ,x)

第59行的恼人箭头所激发

(put (quote ,cmd) 'aa--alts ,alternatives)

为什么不(put cmd 'aa-alts ,alternatives)一样好?

Answers:


20

逗号用于反引号(又称准引号)列表的上下文中,该列表使您可以有选择地评估列表的某些部分。另请参见此线程以获取反引号用法的示例。

几个简单的例子:

(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


1
Ackey,所以在“”前面的引号progn意味着无论嵌套多远,都必须在要评估的内容前面加上逗号。(这,cmd是在另一个列表中,而不是直接在列表中(progn)。)
Unfun Cat 2015年

这似乎是一个很好的机会来进行测试!尝试评估(setq a "a's value" b "b's value" c "c's value")然后评估`(a '(,b c))

其他新手:评估将文本添加到暂存缓冲区中,然后将光标置于行尾,然后按Cxe。
Unfun Cat 2015年

11

那是因为它在宏中。宏需要返回一个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未在调用宏的环境中定义。


这也是一个很好的解释。感谢您将其阐明。
Unfun Cat 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.