Po co cytować pojedynczy argument i przecinek? (cytat, arg)

15

(quote x)marki nie X będzie oceniana, ale dodanie ,przed xwewnątrz quotesprawia, że oceniany. Co to jest to punkt korzystania cytat z pojedynczym argumentem przecinkiem przed nim tak: (quote ,x)?

Motywowany linią 59 od irytujących strzał :

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

Dlaczego nie jest (put cmd 'aa-alts ,alternatives)równie dobry?

The Unfun Cat
źródło

Odpowiedzi:

20

Przecinek jest używany w kontekście backquoted (aka quasiquoted) listy, co pozwala ocenić pewne fragmenty listy wybiórczo. Zobacz także ten wątek, aby zobaczyć przykład zastosowania cofania cudzysłowu.

Kilka prostych przykładów:

(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")

Przecinki, do których się odwołujesz, są w definicji makra, która z kolei używa cudzysłowu 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))))))

,cmdw cudzysłowie pozwala wstawić wartość cmdzamiast na symbol cmd.

Dan
źródło
1
Okej, więc cytat przed prognoznacza, że ​​musisz umieścić przecinek przed rzeczami, które chcesz ocenić, bez względu na to, jak daleko są zagnieżdżone? ( ,cmdJest na innej liście, a nie bezpośrednio w (progn)
środku
To dobra okazja do przetestowania tego! Spróbuj ocenić, (setq a "a's value" b "b's value" c "c's value")a następnie oceń `(a '(,b c)).
Dan
Inne nowości: aby ocenić, dodaj tekst do bufora scratch, następnie umieść kursor na końcu linii, a następnie naciśnij Cxe.
The Unfun Cat
11

To dlatego, że jest w makrze. Makro musi zwrócić formularz Lisp, który z kolei podlega ocenie.

Na przykład, patrząc na pierwsze wywołanie tego makra:

(add-annoying-arrows-advice previous-line '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))

Potrzebujemy rozszerzenia zawierającego:

(put 'previous-line 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))

co (quote ,cmd)osiąga. Jeśli makro użyłoby cmdzamiast tego zwykłego , byłoby trzymane dosłownie, a rozwinięcie wyglądałoby następująco:

(put cmd 'aa-alts '(ace-jump-mode backward-paragraph isearch-backward ido-imenu smart-up))

co jest błędem, ponieważ cmdnie jest zdefiniowane w środowisku, w którym makro jest wywoływane.

legoscia
źródło
To także świetne wytłumaczenie. Dzięki, że to przeliterowałeś.
The Unfun Cat