Gérer «Avertissement: affectation à une variable libre» lorsque certaines bibliothèques peuvent manquer par conception


12

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-listest définie dans externa; bibliothèque expand-regionqui est à http://elpa.gnu.org

Mon mode enregistre l'extension à la expand-regionbibliothèque mais il est correct d'exécuter mon mode sans expand-regionmode.

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 defvarvariable er/try-expand-listêtre de portée lexicale et j'ai un vrai bug?


2
Remarque: vous ne devez pas citer le symbole dans le (defvar er/try-expand-list).
JeanPierre

@JeanPierre Fixed.
gavenkoa

Réponses:


10

Non, setet setqne déclarez pas de variables lexicales. Seulement let. Si vous aviez utilisé letici, 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 defvarcomme dans votre question, mais ne citez pas le symbole.


L'emballage est-il eval-when-compileredondant pour juste defvar? Je ne vois aucun avertissement sans eval-when-compile. Semble eval-when-compilenécessaire si vous utilisez un code actif, comme (require ...)...
gavenkoa

3
Envelopper le defvar serait redondant.
lunaryorn
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.