Vấn đề chung là bạn cần x
và y
được đánh giá trước khi chúng được chèn vào somelist
. Vấn đề với các danh sách trích dẫn (với '
như cú pháp reader) là quote
là một hình thức đặc biệt mà không đánh giá đối số của nó. Theo các chuỗi:
(quote ARG)
Trả về đối số, mà không đánh giá nó. (quote x)
năng suất x
. Cảnh báo: quote
không xây dựng giá trị trả về của nó, mà chỉ trả về giá trị được xây dựng trước bởi trình đọc Lisp ...
Do đó, bạn có cần phải backquote hoặc sử dụng một hàm đánh giá lại các đối số.
Backquote cho phép bạn đánh giá các thành phần của danh sách backquote một cách chọn lọc với ,
cú pháp:
(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"))
Thay phiên, bạn có thể sử dụng cons
(như @tarsius gợi ý trong câu trả lời của anh ấy) hoặc, cho một số phần tử tùy ý , 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"))
Việc sử dụng phụ thuộc vào những gì bạn cần làm với các yếu tố.
`(,x . ,y)
.