Tratar con "Advertencia: asignación a variable libre" cuando ciertas bibliotecas pueden faltar por diseño

12

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-listse define en externo; biblioteca expand-regionque está en http://elpa.gnu.org

Mi extensión de registro de modo a la expand-regionbiblioteca, pero está bien ejecutar mi modo sin expand-regionmodo.

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 defvarvariable er/try-expand-listestaré en el ámbito léxico y tengo un error real?

gavenkoa
fuente
2
Nota al margen: no debe citar el símbolo en el (defvar er/try-expand-list).
JeanPierre
@JeanPierre Fijo.
gavenkoa

Respuestas:

10

No, sety setqno declare variables léxicas. Solo lo lethace. Si lo hubiera usado letaquí, 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 defvarcomo en su pregunta, pero no cite el símbolo.

Lunaryorn
fuente
¿Está envolviendo en eval-when-compileredundante a solo defvar? No veo ninguna advertencia sin eval-when-compile. Parece que eval-when-compilees necesario si usa código activo, como (require ...)...
gavenkoa
3
Envolver defvar sería redundante.
lunaryorn