The below obviously doesn't work and hence this question.
How do I correct the below code so that the value of
'(("abc" . 123)) ?
(setq x "abc") (setq y 123) (setq somelist nil) (add-to-list 'somelist '(x . y))
The general issue is that you need
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:
Return the argument, without evaluating it.
quotedoes 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
(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,
(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
, 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.