El problema general es que se necesita x
y y
para ser evaluado antes de que se insertan en somelist
. El problema con la lista citada (con '
sintaxis como lector) es que quote
es una forma especial que no evalúa su argumento. De acuerdo con la cadena de documentación:
(quote ARG)
Devuelve el argumento, sin evaluarlo. (quote x)
rendimientos x
. Advertencia: quote
no construye su valor de retorno, sino que solo devuelve el valor que fue preconstruido por el lector Lisp ...
Por lo tanto, necesita una comilla inversa o usar una función que evalúe los argumentos.
El backquoting le permite evaluar elementos de una lista de backquoted selectivamente con la ,
sintaxis:
(setq x "x-val" y "y-val" z "z-val" somelist nil)
'(x y z) ; => (x y z)
`(x ,y z) ; => (x "y-val" z)
(add-to-list 'somelist `(x y ,z)) ; => ((x y "z-val"))
Alternativamente, se puede utilizar cons
(como @tarsius sugiere en su respuesta) o, para un número arbitrario de elementos, list
:
(add-to-list 'somelist (cons x y)) ; => (("x-val" . "y-val"))
(setq somelist nil) ; reset
(add-to-list 'somelist (list x y z)) ; => (("x-val" "y-val" "z-val"))
Cuál usar depende de lo que necesite hacer con los elementos.
`(,x . ,y)
.