คำตอบ:
คุณควรถาม Emacsคำถามนี้: C-h iเลือกคู่มือ Elisp ( m Elisp) และค้นหาดัชนีสำหรับ "defvar" ( i defvar) ที่จะพาคุณไปยังโหนดการกำหนดตัวแปร
Emacs บอกคุณว่าdefvarอนุญาตให้ติดสตริง docและถ้าตัวแปรมีค่าอยู่แล้วมันจะไม่ทำอะไรเลย
นอกจากนี้ยังจะบอกคุณเกี่ยวกับการใช้ของมีค่าที่จะได้รับมอบหมาย:defvar (defvar foo)มันจะบอกคุณว่าประกาศตัวแปรที่จะกำหนดขอบเขตแบบไดนามิก
setq ไม่มีคุณสมบัติเหล่านั้น
defvarและsetqมีความคล้ายคลึงกัน แต่ไม่เหมือนกันใน Emacs Lisp และ Common Lisp
defvarเป็นตัวแปรทั่วโลก (ในรูปแบบการเขียนโปรแกรมที่จำเป็น) และการประชุมสำหรับการปรับแต่งในขณะที่ setq เป็นเหมือนการผูกให้ในการเขียนโปรแกรมภาษาการทำงาน ....... )
setqตั้งค่า var โดยไม่คำนึงว่า var (เกิดขึ้น) เป็นโลคัลหรือไม่ defvarประกาศ var เป็นโกลบอล (มันอาจจะเป็น "buffer-local" local-variable-p:.) การเกิด var ที่ถูกผูกไว้เป็นฟังก์ชั่นหาเรื่องหรือโดยletเป็น "local" ตามปกติ หาก var ที่ถูกผูกไว้โดยletเป็นต้นคือ global (หรือ buffer-local) ดังนั้นการโยงโลคัล (การรับรู้ทั่วไป) จะถูกสร้างขึ้นสำหรับช่วงเวลา / ขอบเขตของletมัน ภายในขอบเขตการเชื่อมโยงนั้นsetqเปลี่ยนค่าโลคัล มันเป็นการดีกว่าที่จะพูดคุยเกี่ยวกับการเกิดขึ้นของ var เป็นท้องถิ่น (ในกอง) หรือทั่วโลก (ในกอง) กว่า var เป็นเช่นนั้น
M-x report-emacs-bugจะแนะนำการปรับปรุงที่อาจช่วยให้ผู้อื่นได้ง่ายขึ้น