คำตอบ:
คุณควรถาม 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
จะแนะนำการปรับปรุงที่อาจช่วยให้ผู้อื่นได้ง่ายขึ้น