ฉันกำลังเขียนโหมดหลักของ emacs ซึ่งใช้ตัวแปรบัฟเฟอร์ภายในเพื่อจัดเก็บสถานะบางอย่าง:
(defun foo-mode ()
"My nice major mode"
(interactive)
(kill-all-local-variables)
(setq mode-name "foo")
(setq major-mode 'foo-mode)
(set (make-local-variable 'foo-state) "bar"))
(defun foo-change-state ()
(setq foo-state "baz"))
สิ่งนี้ทำงานได้ดีมากและมีคุณสมบัติที่ในบัฟเฟอร์ใดๆ ที่ไม่ได้ใช้โหมดหลักของฉัน ตัวแปร foo-state
จะไม่ถูกผูกไว้ (ซึ่งเป็นสิ่งที่ดีในความคิดของฉัน เนื่องจากจะช่วยหลีกเลี่ยงไม่ให้ตารางสัญลักษณ์ยุ่งเหยิง)
อย่างไรก็ตาม การคอมไพล์โค้ดแบบไบต์ดังกล่าวทำให้เกิดคำเตือนต่อไปนี้:
Warning: assignment to free variable `foo-state'
การใช้ defvar
จะกำจัดคำเตือน แต่มีผลข้างเคียงที่ตอนนี้ foo-state
ถูกผูกไว้ทุกที่ ซึ่งไม่เป็นที่พึงปรารถนาในความคิดของฉัน
มีวิธีกำจัดคำเตือนในขณะที่ยังไม่รวมตัวแปรเฉพาะโหมดในทุกบัฟเฟอร์หรือไม่? หรือฉันคิดผิดเมื่อคิดว่าไม่ควรประกาศตัวแปรเหล่านี้ทั่วโลก
C-h i g (elisp) Warning Tips RET
เป็นที่ซึ่งมีเอกสารซึ่งตอบคำถามนี้อยู่ - person phils   schedule 08.04.2014define-derived-mode
เช่นเดียวกับใน(define-derived-mode foo-mode nil "foo" "My nice major mode." (set (make-local-variable 'foo-state) "bar"))
- person Stefan   schedule 16.04.2014Warning Tips
ในคู่มือ Emacs มีการโกหกอย่างโจ่งแจ้งเกี่ยวกับdefvar
: คำจำกัดความดังกล่าวไม่มีผลใดๆ ยกเว้นการบอกคอมไพเลอร์ว่าอย่าเตือนเกี่ยวกับการใช้ตัวแปร [...] ในไฟล์นี้.. แน่นอนว่ามันสามารถมีผลกระทบมากกว่านี้อย่างแน่นอน มากกว่าการปิดเสียงคอมไพเลอร์: [it] ยังประกาศตัวแปรเป็นแบบพิเศษ ดังนั้นมันจึงถูกผูกไว้แบบไดนามิกเสมอ แม้ว่า 'การรวมคำศัพท์' จะเป็น t ก็ตาม (คำพูดที่นำมาจากเอกสารจริงสำหรับdefvar
) บางทีคำแนะนำในWarning Tips
อาจถูกเขียนขึ้นก่อนที่จะมีการแนะนำการเชื่อมโยงคำศัพท์ใน Emacs Lisp... - person ack   schedule 01.03.2018