Was ist der Anführungspunkt mit einem Argument und Komma? (Zitat, Argument)

15

(quote x)lässt x nicht ausgewertet werden, aber das Hinzufügen von a ,vor xinside quotemacht es ausgewertet. Was nützt es dann, ein Zitat mit einem einzelnen Argument und einem Komma davor zu verwenden (quote ,x)?

Motiviert durch Linie 59 von nervigen Pfeilen :

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

Warum ist nicht (put cmd 'aa-alts ,alternatives)gleich gut?

Die unfun Katze
quelle

Antworten:

20

Das Komma wird im Kontext einer (quasiquotierten) Liste mit Anführungszeichen verwendet , mit der Sie einige Teile der Liste selektiv auswerten können. In diesem Thread finden Sie auch ein Beispiel für die Verwendung von Backquoting.

Ein paar einfache Beispiele:

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

Die Kommas, auf die Sie sich beziehen, befinden sich in einer Makrodefinition, die wiederum ein Backquoted verwendet 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))))))

,cmdInnerhalb des Backquote können Sie den Wert von cmdanstelle des Symbols einfügen cmd.

Dan
quelle
1
Ackey, bedeutet das Anführungszeichen vor progn, dass Sie ein Komma vor den zu bewertenden Elementen setzen müssen, egal wie weit sie verschachtelt sind? (Die ,cmdbefindet sich in einer anderen Liste, nicht direkt in (progn).)
The Unfun Cat
Dies scheint eine gute Gelegenheit zu sein, es auszuprobieren! Versuchen Sie zu bewerten (setq a "a's value" b "b's value" c "c's value")und dann zu bewerten `(a '(,b c)).
Dan
Andere Newbs: Fügen Sie den Text zum Scratch Buffer hinzu, und platzieren Sie den Cursor am Ende der Zeile. Drücken Sie dann Cxe.
The Unfun Cat
10

Das liegt daran, dass es sich in einem Makro befindet. Ein Makro muss ein Lisp-Formular zurückgeben, das dann ausgewertet wird.

Beispiel für den ersten Aufruf dieses Makros:

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

Die Erweiterung muss enthalten:

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

Welches ist, was (quote ,cmd)erreicht. Wenn das Makro cmdstattdessen plain verwenden würde, würde es buchstäblich beibehalten und die Erweiterung wäre:

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

Dies ist ein Fehler, da er cmdnicht in der Umgebung definiert ist, in der das Makro aufgerufen wird.

Legoscia
quelle
Dies ist auch eine gute Erklärung. Danke, dass Sie es formuliert haben.
The Unfun Cat