Общая проблема заключается в том, что вам нужно x
и y
нужно оценить, прежде чем они будут вставлены в somelist
. Проблема с цитируемым списком (с '
синтаксисом читателя) заключается в том, что quote
это специальная форма, которая не оценивает его аргумент. Согласно документации:
(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)
.