Compilación de bytes de mi modo:
(defun dict-setup-expansions ()
"Add `dict-mode' specific expansions."
(set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))
da advertencia:
Warning: assignment to free variable `er/try-expand-list'
Esta es una situación normal porque er/try-expand-list
se define en externo; biblioteca expand-region
que está en http://elpa.gnu.org
Mi extensión de registro de modo a la expand-region
biblioteca, pero está bien ejecutar mi modo sin expand-region
modo.
Creo que la forma correcta de lidiar con la advertencia es agregar una declaración:
(defvar er/try-expand-list)
defvar
los documentos dicen:
The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.
Yo uso -*- lexical-binding: t -*-
. ¿Eso significa que sin defvar
variable er/try-expand-list
estaré en el ámbito léxico y tengo un error real?
(defvar er/try-expand-list)
.Respuestas:
No,
set
ysetq
no declare variables léxicas. Solo lolet
hace. Si lo hubiera usadolet
aquí, tendría un error, pero está bien. La advertencia existe principalmente para detectar errores tipográficos cuando se utilizan variables dinámicas.Para que la advertencia desaparezca, úsela
defvar
como en su pregunta, pero no cite el símbolo.fuente
eval-when-compile
redundante a solodefvar
? No veo ninguna advertencia sineval-when-compile
. Parece queeval-when-compile
es necesario si usa código activo, como(require ...)
...