ความแตกต่างระหว่าง setq และ defvar คืออะไร


14

ความแตกต่างระหว่างsetqและdefvarใน Emacs เสียงกระเพื่อมคืออะไร?

ผมเห็นรุ่นกระเพื่อมทั่วไปของคำถามเดียวกันที่/programming/3855862 พวกเขาเหมือนกันใน Elisp หรือไม่

คำตอบ:


18

คุณควรถาม Emacsคำถามนี้: C-h iเลือกคู่มือ Elisp ( m Elisp) และค้นหาดัชนีสำหรับ "defvar" ( i defvar) ที่จะพาคุณไปยังโหนดการกำหนดตัวแปร

Emacs บอกคุณว่าdefvarอนุญาตให้ติดสตริง docและถ้าตัวแปรมีค่าอยู่แล้วมันจะไม่ทำอะไรเลย

นอกจากนี้ยังจะบอกคุณเกี่ยวกับการใช้ของมีค่าที่จะได้รับมอบหมาย:defvar (defvar foo)มันจะบอกคุณว่าประกาศตัวแปรที่จะกำหนดขอบเขตแบบไดนามิก

setq ไม่มีคุณสมบัติเหล่านั้น

defvarและsetqมีความคล้ายคลึงกัน แต่ไม่เหมือนกันใน Emacs Lisp และ Common Lisp

อ่านเพิ่มเติมเพื่อเรียนรู้เพิ่มเติม


1
ในความเป็นจริง defvar ยังประกาศว่า "การกำหนดขอบเขตพลวัต" ถ้ามีค่าที่กำหนดและยังคงเป็นจริงแม้ว่าตัวแปรจะมีค่าอยู่แล้ว OTOH "ถ้าตัวแปรมีค่าอยู่แล้วมันจะไม่ทำอะไรเลย" เป็นความจริงสำหรับการใช้ defvar ที่ถูกต้อง (และ bytecompiler ควรออกคำเตือนในกรณีที่เหลือเช่นถ้าประกาศตัวแปรหลังจากใช้ครั้งแรก)
YoungFrog

ดังนั้นจึงดูเหมือนdefvarเป็นตัวแปรทั่วโลก (ในรูปแบบการเขียนโปรแกรมที่จำเป็น) และการประชุมสำหรับการปรับแต่งในขณะที่ setq เป็นเหมือนการผูกให้ในการเขียนโปรแกรมภาษาการทำงาน ....... )
ลัส

@ นิโคลัส: โปรดอ่านคู่มือ setqตั้งค่า var โดยไม่คำนึงว่า var (เกิดขึ้น) เป็นโลคัลหรือไม่ defvarประกาศ var เป็นโกลบอล (มันอาจจะเป็น "buffer-local" local-variable-p:.) การเกิด var ที่ถูกผูกไว้เป็นฟังก์ชั่นหาเรื่องหรือโดยletเป็น "local" ตามปกติ หาก var ที่ถูกผูกไว้โดยletเป็นต้นคือ global (หรือ buffer-local) ดังนั้นการโยงโลคัล (การรับรู้ทั่วไป) จะถูกสร้างขึ้นสำหรับช่วงเวลา / ขอบเขตของletมัน ภายในขอบเขตการเชื่อมโยงนั้นsetqเปลี่ยนค่าโลคัล มันเป็นการดีกว่าที่จะพูดคุยเกี่ยวกับการเกิดขึ้นของ var เป็นท้องถิ่น (ในกอง) หรือทั่วโลก (ในกอง) กว่า var เป็นเช่นนั้น
ดึง

1
@ นิโคลัส: ใช้เวลาในการอ่านและอ่านใหม่ บางครั้งสิ่งที่พูดมีความแม่นยำ แต่ยากที่จะเข้าใจเช่นข้อกำหนดที่เป็นทางการ เมื่อคุณได้รับมันอาจเป็นประโยชน์สำหรับคุณที่M-x report-emacs-bugจะแนะนำการปรับปรุงที่อาจช่วยให้ผู้อื่นได้ง่ายขึ้น
ดึง

1
@ นิโคลัส: เริ่มต้นด้วยการทำความเข้าใจกับตัวแปรในฮีป (หรือที่รู้จักกันในชื่อตัวแปรโกลบอลหรือบัฟเฟอร์ - โลคอล) คุณน่าจะเข้าใจตัวแปรโลคอลจริงแล้วนั่นคือตัวแปรบนสแต็ก Google ก็อาจช่วยได้เช่นกัน
ดึง
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.