Pregunta:
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
está definido en la expand-region
biblioteca externa.
Mi modo registra la extensión para expand-region
biblioteca de la expand-region
, pero está bien ejecutar mi modo sin el modo de expand-region
.
Creo que la forma correcta de lidiar con la advertencia es agregar una declaración:
(defvar er/try-expand-list)
defvar
docs 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 -*-
. ¿ defvar
significa que sin la variable defvar
er/try-expand-list
estaría en el alcance léxico y tengo un error real?
Respuesta:
No, set
y setq
no declaran variables léxicas. Solo let
lo let
hace. Si hubiera usado let
aquí, tendría un error, pero está bien. La advertencia existe principalmente para detectar errores tipográficos cuando se utilizan variables dinámicas.
Para hacer que la advertencia desaparezca, use defvar
como en su pregunta, pero no cite el símbolo.