¿Cuál es el punto de cita con argumento simple y coma? (cita, arg)
15
(quote x)hace que x no se evalúe, pero al agregar un ,frente xdentro se quotehace evaluar. ¿Cuál es entonces el punto de usar comillas con un solo argumento con una coma delante de ella, así (quote ,x):?
La coma se usa en el contexto de una lista con comillas invertidas (también conocida como cuasicotipada), que le permite evaluar algunas partes de la lista de forma selectiva. Vea también este hilo para ver un ejemplo de uso para backquoting.
Un par de ejemplos simples:
(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, entonces, la cita en frente prognsignifica que tienes que poner una coma delante de las cosas que quieres evaluar, sin importar cuán lejos estén anidadas. (El ,cmdestá dentro de otra lista, no directamente dentro (progn).)
The Unfun Cat
¡Parece una buena oportunidad para probarlo! Intenta evaluar (setq a "a's value" b "b's value" c "c's value")y luego evaluar `(a '(,b c)).
Dan
Otros novatos: para evaluar, agregue el texto a su búfer de memoria virtual, luego coloque el cursor al final de la línea, luego presione Cxe.
The Unfun Cat
11
Eso es porque está dentro de una macro. Una macro necesita devolver un formulario Lisp, que a su vez se evalúa.
Por ejemplo, mirando la primera invocación de esta macro:
progn
significa que tienes que poner una coma delante de las cosas que quieres evaluar, sin importar cuán lejos estén anidadas. (El,cmd
está dentro de otra lista, no directamente dentro(progn)
.)(setq a "a's value" b "b's value" c "c's value")
y luego evaluar`(a '(,b c))
.Eso es porque está dentro de una macro. Una macro necesita devolver un formulario Lisp, que a su vez se evalúa.
Por ejemplo, mirando la primera invocación de esta macro:
Necesitamos la expansión para contener:
que es lo que
(quote ,cmd)
logra Si la macro usara simplementecmd
, se mantendría literalmente y la expansión sería:lo cual es un error, porque
cmd
no está definido en el entorno donde se invoca la macro.fuente