Qual è il punto di citazione con argomento singolo e virgola? (citazione, arg)


15

(quote x)rende x non essere valutato, ma l'aggiunta di un ,davanti xall'interno lo quoterende valutato. Qual è quindi il punto di usare la citazione con un singolo argomento con una virgola davanti, in questo modo (quote ,x):?

Motivato dalla linea 59 da fastidiose frecce :

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

Perché non è (put cmd 'aa-alts ,alternatives)altrettanto buono?

Risposte:


20

La virgola viene utilizzata nel contesto di un elenco retroquotato (aka quasiquotato), che consente di valutare alcune parti dell'elenco in modo selettivo. Vedi anche questo thread per un esempio di utilizzo per il backquoting.

Un paio di semplici esempi:

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

Le virgole a cui ti riferisci sono in una definizione macro che, a sua volta, utilizza un backquoted 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))))))

,cmdall'interno del backquote consente di inserire il valore di cmdanziché il simbolo cmd.


1
Ackey, quindi la citazione davanti prognsignifica che devi mettere una virgola davanti alle cose che vuoi valutare, non importa quanto sia nidificato? ( ,cmdÈ all'interno di un altro elenco, non direttamente all'interno (progn).)
The Unfun Cat,

Questa sembra una buona opportunità per provarlo! Prova a valutare (setq a "a's value" b "b's value" c "c's value")e quindi a valutare `(a '(,b c)).
Dan

Altre novità: per valutare aggiungi il testo al buffer di memoria virtuale, quindi posiziona il cursore alla fine della riga, quindi premi Cxe.
The Unfun Cat,

11

Questo perché è all'interno di una macro. Una macro deve restituire un modulo Lisp, che a sua volta viene valutato.

Ad esempio, guardando la prima chiamata di questa macro:

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

Abbiamo bisogno che l'espansione contenga:

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

che è ciò che (quote ,cmd)raggiunge. Se invece la macro usasse plain cmd, sarebbe mantenuta letteralmente e l'espansione sarebbe:

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

che è un errore, perché cmdnon è definito nell'ambiente in cui viene invocata la macro.


Questa è anche un'ottima spiegazione. Grazie per averlo spiegato.
The Unfun Cat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.