Masalah umum adalah bahwa Anda perlu x
dan y
dievaluasi sebelum dimasukkan somelist
. Masalah dengan daftar yang dikutip (dengan '
sintaks sebagai pembaca) adalah quote
bentuk khusus yang tidak mengevaluasi argumennya. Menurut dokumen itu:
(quote ARG)
Kembalikan argumen, tanpa mengevaluasinya. (quote x)
hasil panen x
. Peringatan: quote
tidak membangun nilai kembalinya, tetapi hanya mengembalikan nilai yang telah dibangun sebelumnya oleh pembaca Lisp ...
Oleh karena itu, Anda perlu mengutip atau menggunakan fungsi yang mengevaluasi argumen.
Backquoting memungkinkan Anda untuk mengevaluasi elemen daftar backquoted selektif dengan ,
sintaks:
(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"))
Sebagai alternatif, Anda dapat menggunakan cons
(sebagai @tarsius menyarankan dalam jawabannya) atau, untuk jumlah sewenang-wenang elemen, 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"))
Yang digunakan tergantung pada apa yang perlu Anda lakukan dengan elemen.
`(,x . ,y)
.