Який сенс цитати з одним аргументом і комою? (цитата, аргумент)


15

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

Мотивовано рядком 59 від дратівливих стрілок :

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

Чому не (put cmd 'aa-alts ,alternatives)однаково добре?

Відповіді:


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
Акі, тому цитата перед тим prognозначає, що ви повинні поставити кому перед речами, які ви хочете оцінити, незалежно від того, наскільки вона вкладена? ( ,cmdЄ в іншому списку, а не безпосередньо (progn).)
Нефункціональний кіт

Це здається гарною можливістю перевірити це! Спробуйте оцінити, (setq a "a's value" b "b's value" c "c's value")а потім оцінити `(a '(,b c)).
Дан

Інші новички: щоб оцінити, додайте текст до буфера скретчів, потім помістіть курсор у кінці рядка, а потім натисніть Cxe.
The Unfun Cat

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не визначено в середовищі, де викликається макрос.


Це також чудове пояснення. Дякуємо, що прописали це.
The Unfun Cat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.