The below obviously doesn't work and hence this question.
How do I correct the below code so that the value of somelist
becomes '(("abc" . 123))
?
(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))
The below obviously doesn't work and hence this question.
How do I correct the below code so that the value of somelist
becomes '(("abc" . 123))
?
(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))
The general issue is that you need x
and y
to be evaluated before they get inserted in somelist
. The issue with the quoted list (with '
as reader syntax) is that quote
is a special form that does not evaluate its argument. According to the docstring:
(quote ARG)
Return the argument, without evaluating it.
(quote x)
yieldsx
. Warning:quote
does not construct its return value, but just returns the value that was pre-constructed by the Lisp reader...
Hence, you either need to backquote or use a function that evaluates the arguments.
Backquoting allows you to evaluate elements of a backquoted list selectively with the ,
syntax:
(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"))
Alternately, you can use cons
(as @tarsius suggests in his answer) or, for an arbitrary number of elements, 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"))
Which to use depends on what you need to do with the elements.
Do not quote the cons cell, because quoted expressions are not evaluated. That's exactly why one quotes - to prevent evaluation. But that's not what you want, so don't.
Instead use the form that creates a cons cell from two evaluated values, its arguments.
(cons x y)
Of course you can also quasiquote but that doesn't really make sense here, and looks worse. Only use `
and ,
when that improves readability, i.e. when doing something more complex than constructing a cons cell or adding an atom or list at the beginning of some existing list.
Using quasiquoting it would look like this:
`(,x . ,y)
Which is worse because it uses additional syntax which isn't required at all in this case and obfuscates that cons
is being used.