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)?
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")
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.
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:
progn
, dass Sie ein Komma vor den zu bewertenden Elementen setzen müssen, egal wie weit sie verschachtelt sind? (Die,cmd
befindet sich in einer anderen Liste, nicht direkt in(progn)
.)(setq a "a's value" b "b's value" c "c's value")
und dann zu bewerten`(a '(,b c))
.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:
Die Erweiterung muss enthalten:
Welches ist, was
(quote ,cmd)
erreicht. Wenn das Makrocmd
stattdessen plain verwenden würde, würde es buchstäblich beibehalten und die Erweiterung wäre:Dies ist ein Fehler, da er
cmd
nicht in der Umgebung definiert ist, in der das Makro aufgerufen wird.quelle