Compilação de bytes do meu modo:
(defun dict-setup-expansions ()
"Add `dict-mode' specific expansions."
(set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))
dá aviso:
Warning: assignment to free variable `er/try-expand-list'
Esta é uma situação normal porque er/try-expand-list
é definida em externa; biblioteca expand-region
que está em http://elpa.gnu.org
Meu modo registra extensão na expand-region
biblioteca, mas não há problema em executar meu modo sem o expand-region
modo.
Eu acho que a maneira correta de lidar com o aviso é adicionar declaração:
(defvar er/try-expand-list)
defvar
os documentos dizem:
The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.
Eu uso -*- lexical-binding: t -*-
. Isso significa que sem defvar
variável er/try-expand-list
estar no escopo lexical e eu tenho um bug real?
(defvar er/try-expand-list)
.Respostas:
Não,
set
esetq
não declare variáveis lexicais. Sólet
faz. Se você tivesse usadolet
aqui, teria um bug, mas isso é bom. O aviso existe principalmente para detectar erros de digitação ao usar variáveis dinâmicas.Para fazer o aviso desaparecer, use
defvar
como em sua pergunta, mas não cite o símbolo.fonte
eval-when-compile
redundante apenasdefvar
? Não vejo nenhum aviso semeval-when-compile
. Parece queeval-when-compile
é necessário se o uso de código ativa, como(require ...)
...