คำถามติดแท็ก lexical-scoping

3
ทำไม `ให้ 'เร็วขึ้นด้วยขอบเขตศัพท์?
ขณะอ่านผ่านซอร์สโค้ดของdolistมาโครฉันพบความคิดเห็นต่อไปนี้ ;; นี้ไม่ได้มีการทดสอบความน่าเชื่อถือ แต่มันก็ไม่ได้เรื่องเพราะทั้งสองความหมายเป็นที่ยอมรับสรรพสินค้าหนึ่งที่เร็วขึ้นเล็กน้อยกับการกำหนดขอบเขตแบบไดนามิกและอื่น ๆ ที่เป็นเร็วขึ้นเล็กน้อย (และมีความหมายทำความสะอาด) ที่มีการกำหนดขอบเขตของคำศัพท์ ซึ่งอ้างถึงตัวอย่างนี้ (ซึ่งฉันได้ทำให้เข้าใจง่ายขึ้น) (if lexical-binding (let ((temp list)) (while temp (let ((it (car temp))) ;; Body goes here (setq temp (cdr temp))))) (let ((temp list) it) (while temp (setq it (car temp)) ;; Body goes here (setq temp (cdr temp))))) มันทำให้ฉันประหลาดใจเมื่อเห็นletรูปแบบที่ใช้ในวง ฉันเคยคิดว่ามันช้าเมื่อเทียบกับการใช้ซ้ำ ๆsetqกับตัวแปรภายนอกเดียวกัน …

1
ทำไม setq และ set quote ทำหน้าที่แตกต่างกันของตัวแปรที่มีขอบเขตเป็นขอบเขต
ฉันมีข้อผิดพลาดในหนึ่งในส่วนขยายของฉันซึ่งในที่สุดก็กลายเป็นว่าเกิดจากการsetไม่ทำงานตามที่ฉันคาดไว้: ;; -*- lexical-binding: t -*- (let ((a nil)) (setq a t) (print a)) (let ((a nil)) (set 'a t) (print a)) เมื่อทำงานกับงานemacs -Q --batch -l temp.elพิมพ์: t nil ดูเหมือนว่าฉันจะแปลกมาก ผมก็รู้สึกว่าเป็นชวเลข(setq a b) (set 'a b)เกิดอะไรขึ้น?

3
Defun ภายในให้กับคำศัพท์ผูกพันให้เตือนไบต์รวบรวม "ฟังก์ชั่นไม่เป็นที่รู้จักที่จะกำหนด"
ฉันต้องการได้รับผลกระทบของตัวแปรคงที่โดยใช้defunด้านในของletกับการผูกศัพท์เพื่อสร้างการปิด อย่างไรก็ตามเมื่อทำการคอมไพล์ไฟล์ฉันได้รับคำเตือน ฉันกำลังทำสิ่งผิดปกติหรือไม่ถ้าไม่มีวิธีระงับคำเตือนนี้หรือไม่? ฉันสร้าง MCVE แล้ว: ;; -*- lexical-binding: t -*- (let ((count 0)) (defun increase-count () (interactive) (setq count (1+ count)) (message "Count is: %d" count)) ;; The warning happens here. (increase-count)) รหัสทำงานได้ตามที่คาดไว้: ฟังก์ชันจะincrease-countพิมพ์ "Count is: n" โดยที่ n เพิ่มขึ้นทุกครั้งที่เรียกใช้ อย่างไรก็ตามเมื่อคอมไพล์ไฟล์นี้ฉันได้รับคำเตือนต่อไปนี้: In end of data: mcve.el:11:1:Warning: the function ‘increase-count’ …

1
ข้อผิดพลาดที่อาจเกิดขึ้นจากการเปิดใช้งานการเชื่อมคำศัพท์สำหรับบัฟเฟอร์คืออะไร?
สิ่งนี้ได้รับแรงบันดาลใจจากการสนทนาของคำศัพท์ที่มีผลผูกพันและศัพท์ให้ในคำถามนี้ เนื่องจากการเชื่อมคำศัพท์ช่วยให้คุณมีความสามารถในการปิดที่มีประโยชน์ซึ่งผู้คนอาจคุ้นเคยในภาษาอื่นเช่น JavaScript ทำไมคุณไม่เปิดใช้งานตลอดเวลา การใช้ความเข้ากันได้แบบย้อนหลังกับ Emacsen รุ่นเก่านั้นไม่ได้เป็นปัญหาที่คุณควรมองหาหากเปิดใช้งานในบัฟเฟอร์รหัสดั้งเดิม

1
การจัดการกับ“ คำเตือน: การกำหนดให้กับตัวแปรอิสระ” เมื่อไลบรารีบางอย่างอาจหายไปจากการออกแบบ
การรวบรวมไบต์ของโหมดของฉัน: (defun dict-setup-expansions () "Add `dict-mode' specific expansions." (set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article))) ให้คำเตือน: Warning: assignment to free variable `er/try-expand-list' นี่เป็นสถานการณ์ปกติเพราะer/try-expand-listมีการกำหนดไว้ในภายนอก ห้องสมุดexpand-regionซึ่งอยู่ที่http://elpa.gnu.org โหมดของฉันลงทะเบียนส่วนขยายไปยังexpand-regionไลบรารี แต่มันก็โอเคที่จะใช้โหมดของฉันโดยไม่มีexpand-regionโหมด ฉันคิดว่าวิธีที่เหมาะสมในการจัดการกับคำเตือนคือการเพิ่มการประกาศ: (defvar er/try-expand-list) defvar เอกสารพูดว่า: The `defvar' form also declares the variable as "special", so that it is always dynamically bound even if `lexical-binding' is t. …

1
การกำหนดขอบเขตตัวแปรสำหรับมาโครเป็นอย่างไร
macro.elใช้แมโครตัวอย่างต่อไปนี้ที่กำหนดไว้ใน (defmacro some-macro (&rest body) `(let ((some-variable 1)) ,@body)) และสามารถใช้ฟังก์ชั่นดังต่อไปนี้กำหนดไว้ในแฟ้มที่แตกต่างกันfunction.el , (defun some-function () (some-macro (do-something))) เมื่อfunction.elใดที่คอมไพล์ด้วยไบต์จะsome-variableถูกผูกไว้ภายใต้การรวมคำหรือแบบไดนามิก? ฉันเข้าใจว่าสิ่งนี้ขึ้นอยู่กับว่าไฟล์นั้นใช้-*- lexical-binding: t; -*-หรือไม่ดังนั้นคำถามของฉันเกี่ยวกับสถานการณ์ต่อไปนี้โดยเฉพาะ: หากfunction.elใช้การเชื่อมศัพท์ แต่macro.elไม่ หากmacro.elใช้การเชื่อมศัพท์ แต่function.elไม่ มันสร้างความแตกต่างถ้าsome-varมีการประกาศทั่วโลก (มี defvar) ภายในfunction.el? ถ้าไม่ฉันสนใจโดยเฉพาะในกรณีที่มันไม่ได้

3
เหตุใดการกำหนดขอบเขตของ defvar จึงแตกต่างกันโดยไม่มีค่าเริ่มต้น
สมมติว่าฉันมีชื่อไฟล์elisp-defvar-test.elที่มี: ;;; elisp-defvar-test.el --- -*- lexical-binding: t -*- (defvar my-dynamic-var) (defun f1 (x) "Should return X." (let ((my-dynamic-var x)) (f2))) (defun f2 () "Returns the current value of `my-dynamic-var'." my-dynamic-var) (provide 'elisp-dynamic-test) ;;; elisp-defvar-test.el ends here ฉันโหลดไฟล์นี้แล้วไปที่บัฟเฟอร์รอยขีดข่วนและเรียกใช้: (setq lexical-binding t) (f1 5) (let ((my-dynamic-var 5)) (f2)) (f1 5)ส่งคืน 5 ตามที่คาดไว้ซึ่งแสดงว่าเนื้อความของf1ถือmy-dynamic-varเป็นตัวแปรที่กำหนดขอบเขตแบบไดนามิกตามที่คาดไว้ …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.