O problema geral é que você precisa x
e y
deve ser avaliado antes de serem inseridos somelist
. O problema com a lista citada (com '
sintaxe do leitor) é que quote
é uma forma especial que não avalia seu argumento. De acordo com a doutrina:
(quote ARG)
Retorne o argumento, sem avaliá-lo. (quote x)
rendimentos x
. Atenção: quote
não constrói seu valor de retorno, mas apenas retorna o valor que foi pré-construído pelo leitor Lisp ...
Portanto, você precisa fazer uma cotação retroativa ou usar uma função que avalie os argumentos.
A cotação retroativa permite avaliar elementos de uma lista de cotações retroativas seletivamente com a ,
sintaxe:
(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, você pode usar cons
(como @tarsius sugere na sua resposta) ou, para um número arbitrário 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"))
Qual usar depende do que você precisa fazer com os elementos.
`(,x . ,y)
.