Lidando com “Aviso: atribuição à variável livre” quando certas bibliotecas podem estar ausentes por design

12

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-regionque está em http://elpa.gnu.org

Meu modo registra extensão na expand-regionbiblioteca, mas não há problema em executar meu modo sem o expand-regionmodo.

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 defvarvariável er/try-expand-listestar no escopo lexical e eu tenho um bug real?

gavenkoa
fonte
2
Nota lateral: você não deve citar o símbolo no (defvar er/try-expand-list).
JeanPierre
@JeanPierre Fixed.
gavenkoa

Respostas:

10

Não, sete setqnão declare variáveis ​​lexicais. Só letfaz. Se você tivesse usado letaqui, 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 defvarcomo em sua pergunta, mas não cite o símbolo.

lunaryorn
fonte
O agrupamento é eval-when-compileredundante apenas defvar? Não vejo nenhum aviso sem eval-when-compile. Parece que eval-when-compileé necessário se o uso de código ativa, como (require ...)...
gavenkoa
3
Embrulhar defvar seria redundante.
lunaryorn