ปัญหาทั่วไปคือคุณต้องx
และได้รับการประเมินก่อนที่จะแทรกอยู่ในy
somelist
ปัญหาของรายการที่ยกมา (พร้อมด้วย'
ไวยากรณ์ผู้อ่าน)คือว่าquote
เป็นรูปแบบพิเศษที่ไม่ได้ประเมินอาร์กิวเมนต์ ตามเอกสาร:
(quote ARG)
ส่งคืนอาร์กิวเมนต์โดยไม่ประเมินค่า อัตราผลตอบแทน(quote x)
x
คำเตือน: quote
ไม่สร้างค่าส่งคืน แต่เพียงส่งคืนค่าที่สร้างไว้ล่วงหน้าโดยตัวอ่าน Lisp ...
ดังนั้นคุณจะต้องแบ็คโคทหรือใช้ฟังก์ชั่นที่ประเมินข้อโต้แย้ง
Backquoting ช่วยให้คุณสามารถประเมินองค์ประกอบของรายการที่ยกมาเลือกด้วย,
ไวยากรณ์:
(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)
ดู