Какой смысл в кавычках с одним аргументом и запятой? (цитата, аргумент)

15

(quote x)делает x не оцененным, но добавление ,перед xвнутри quoteделает его оцененным. В чем тогда смысл использовать цитату с одним аргументом с запятой перед ним, как так: (quote ,x)?

По мотивам строки 59 раздражающие стрелки :

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

Почему не (put cmd 'aa-alts ,alternatives)одинаково хорошо?

Несчастный кот
источник

Ответы:

20

Запятая используется в контексте закавыченных (ака quasiquoted) список, который позволяет оценить некоторые части списка выборочно. Смотрите также эту ветку для примера использования для обратного цитирования.

Пара простых примеров:

(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
Итак, цитата перед значком prognозначает, что вы должны поставить запятую перед тем, что вы хотите оценить, независимо от того, насколько далеко оно вложено? (Это ,cmdв другом списке, а не непосредственно в нем (progn).)
Несовершеннолетний кот
Это похоже на хорошую возможность проверить это! Попробуйте оценить, (setq a "a's value" b "b's value" c "c's value")а затем оценить `(a '(,b c)).
Дан
Другие новинки: чтобы оценить, добавьте текст в рабочий буфер, поместите курсор в конец строки и нажмите Cxe.
Несчастный кот
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не определено в среде, где вызывается макрос.

legoscia
источник
Это тоже отличное объяснение. Спасибо за разъяснение.
Несчастный кот