Это потому, что это внутри макроса. Макрос должен возвращать форму 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)
.)