Compilation d'octets de mon mode:
(defun dict-setup-expansions ()
"Add `dict-mode' specific expansions."
(set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))
donne un avertissement:
Warning: assignment to free variable `er/try-expand-list'
C'est une situation normale car elle er/try-expand-list
est définie dans externa; bibliothèque expand-region
qui est à http://elpa.gnu.org
Mon mode enregistre l'extension à la expand-region
bibliothèque mais il est correct d'exécuter mon mode sans expand-region
mode.
Je pense que la bonne façon de gérer l'avertissement est d'ajouter une déclaration:
(defvar er/try-expand-list)
defvar
les documents disent:
The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.
J'utilise -*- lexical-binding: t -*-
. Est-ce que cela signifie que sans defvar
variable er/try-expand-list
être de portée lexicale et j'ai un vrai bug?
(defvar er/try-expand-list)
.Réponses:
Non,
set
etsetq
ne déclarez pas de variables lexicales. Seulementlet
. Si vous aviez utilisélet
ici, vous auriez un bug, mais ça va. L'avertissement existe principalement pour détecter les fautes de frappe lors de l'utilisation de variables dynamiques.Pour faire disparaître l'avertissement, utilisez
defvar
comme dans votre question, mais ne citez pas le symbole.la source
eval-when-compile
redondant pour justedefvar
? Je ne vois aucun avertissement sanseval-when-compile
. Sembleeval-when-compile
nécessaire si vous utilisez un code actif, comme(require ...)
...