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-list
didefinisikan dalam externa; perpustakaan expand-region
yang ada di http://elpa.gnu.org
Mode saya mendaftar ekstensi ke expand-region
perpustakaan tetapi tidak apa-apa untuk menjalankan mode saya tanpa expand-region
mode.
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 defvar
variabel er/try-expand-list
berada dalam lingkup leksikal dan saya memiliki bug nyata?
(defvar er/try-expand-list)
.Jawaban:
Tidak,
set
dansetq
jangan mendeklarasikan variabel leksikal. Hanyalet
itu. Seandainya Anda menggunakan dilet
sini 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
defvar
seperti dalam pertanyaan Anda, tapi jangan tidak mengutip simbol.sumber
eval-when-compile
berlebihan menjadi adildefvar
? Saya tidak melihat peringatan tanpaeval-when-compile
. Sepertinya itueval-when-compile
perlu jika menggunakan kode aktif, seperti(require ...)
...