การจัดการกับ“ คำเตือน: การกำหนดให้กับตัวแปรอิสระ” เมื่อไลบรารีบางอย่างอาจหายไปจากการออกแบบ


12

การรวบรวมไบต์ของโหมดของฉัน:

(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.

-*- lexical-binding: t -*-ฉันใช้ นั่นหมายความว่าไม่มีdefvarตัวแปรer/try-expand-listอยู่ในขอบเขตศัพท์และฉันมีข้อผิดพลาดจริง?


2
บันทึก Side: (defvar er/try-expand-list)คุณไม่ควรพูดในสัญลักษณ์ที่
JeanPierre

@JeanPierre แก้ไขแล้ว
gavenkoa

คำตอบ:


10

ไม่setและsetqอย่าประกาศตัวแปรคำ เท่านั้นletไม่ ถ้าคุณใช้letที่นี่คุณจะมีข้อบกพร่อง แต่ก็ไม่เป็นไร คำเตือนส่วนใหญ่มีอยู่เพื่อจับการพิมพ์ผิดเมื่อใช้ตัวแปรแบบไดนามิก

เพื่อให้เตือนไปออกไปใช้งานdefvarเช่นเดียวกับในคำถามของคุณ แต่ไม่ได้พูดสัญลักษณ์


ห่อเป็นสิ่งที่eval-when-compileซ้ำซ้อนdefvarหรือไม่ eval-when-compileฉันไม่เห็นคำเตือนโดยไม่ต้อง ดูเหมือนว่าeval-when-compileจำเป็นถ้าใช้รหัสที่ใช้งานอยู่เช่น(require ...)...
gavenkoa

3
การตัด defvar จะซ้ำซ้อน
Lunaryorn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.