Berurusan dengan "Peringatan: penugasan ke variabel bebas" ketika perpustakaan tertentu bisa hilang dengan desain

12

Kompilasi byte mode saya:

(defun dict-setup-expansions ()
  "Add `dict-mode' specific expansions."
  (set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))

memberi peringatan:

Warning: assignment to free variable `er/try-expand-list'

Ini adalah situasi yang normal karena er/try-expand-listdidefinisikan dalam externa; perpustakaan expand-regionyang ada di http://elpa.gnu.org

Mode saya mendaftar ekstensi ke expand-regionperpustakaan tetapi tidak apa-apa untuk menjalankan mode saya tanpa expand-regionmode.

Saya pikir cara yang tepat untuk menangani peringatan adalah dengan menambahkan deklarasi:

(defvar er/try-expand-list)

defvar dokumen mengatakan:

The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.

Saya menggunakan -*- lexical-binding: t -*-. Apakah itu berarti bahwa tanpa defvarvariabel er/try-expand-listberada dalam lingkup leksikal dan saya memiliki bug nyata?

gavenkoa
sumber
2
Catatan: Anda tidak boleh mengutip simbol di (defvar er/try-expand-list).
JeanPierre
@JeanPierre Diperbaiki.
gavenkoa

Jawaban:

10

Tidak, setdan setqjangan mendeklarasikan variabel leksikal. Hanya letitu. Seandainya Anda menggunakan di letsini Anda akan memiliki bug, tapi ini baik-baik saja. Peringatan ada sebagian besar untuk menangkap kesalahan ketik saat menggunakan variabel dinamis.

Untuk membuat peringatan pergi penggunaan defvarseperti dalam pertanyaan Anda, tapi jangan tidak mengutip simbol.

lunaryorn
sumber
Apakah membungkus eval-when-compileberlebihan menjadi adil defvar? Saya tidak melihat peringatan tanpa eval-when-compile. Sepertinya itu eval-when-compileperlu jika menggunakan kode aktif, seperti (require ...)...
gavenkoa
3
Membungkus defvar akan menjadi berlebihan.
lunaryorn