Загальна проблема в тому , що вам потрібно , x
і y
повинні бути оцінені , перш ніж вони вставлені в somelist
. Проблема зі списком цитованих (з '
синтаксисом читача) полягає в тому, що quote
це спеціальна форма, яка не оцінює його аргумент. Відповідно до docstring:
(quote ARG)
Поверніть аргумент, не оцінюючи його. (quote x)
врожайність x
. Попередження: quote
не будує свого повернутого значення, а просто повертає значення, яке було попередньо побудовано читачем Lisp ...
Отже, вам потрібно або зворотне цитування, або використання функції, що оцінює аргументи.
Зворотне котирування дає змогу вибірково оцінювати елементи списку із зворотним цитуванням із ,
синтаксисом:
(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"))
Крім того , ви можете використовувати cons
(як @tarsius пропонує в своїй відповіді) або, для довільного числа елементів 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"))
Що використовувати, залежить від того, що потрібно робити з елементами.
`(,x . ,y)
.