Trattare con "Avvertenza: assegnazione a variabile libera" quando alcune librerie possono mancare in base alla progettazione


12

Compilazione dei byte della mia modalità:

(defun dict-setup-expansions ()
  "Add `dict-mode' specific expansions."
  (set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))

dà avvertimento:

Warning: assignment to free variable `er/try-expand-list'

Questa è una situazione normale perché er/try-expand-listè definita in esterno; biblioteca expand-regionche si trova su http://elpa.gnu.org

La mia modalità registra l'estensione nella expand-regionlibreria ma è ok eseguire la mia modalità senza expand-regionmodalità.

Penso che il modo corretto di gestire l'avvertimento sia quello di aggiungere una dichiarazione:

(defvar er/try-expand-list)

defvar i documenti dicono:

The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.

Io uso -*- lexical-binding: t -*-. Significa che senza defvarvariabili er/try-expand-listrientrano nell'ambito lessicale e ho un vero bug?


2
Nota a margine: non dovresti citare il simbolo in (defvar er/try-expand-list).
JeanPierre,

@JeanPierre Risolto.
gavenkoa,

Risposte:


10

No, sete setqnon dichiarare variabili lessicali. Fa solo let. Se avessi usato letqui avresti avuto un bug, ma questo va bene. L'avvertimento esiste principalmente per rilevare errori di battitura quando si utilizzano variabili dinamiche.

Per far sparire l'avvertimento, usa defvarcome nella tua domanda, ma non citare il simbolo.


Il wrapping in eval-when-compileridondante è giusto defvar? Non vedo nessun avviso senza eval-when-compile. Sembra eval-when-compilenecessario se si utilizza un codice attivo, come (require ...)...
gavenkoa,

3
Avvolgere defvar sarebbe ridondante.
lunaryorn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.