Umgang mit „Warnung: Zuordnung zu freien Variablen“, wenn bestimmte Bibliotheken aufgrund ihres Designs fehlen können

12

Byte-Kompilierung meines Modus:

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

warnt:

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

Dies ist eine normale Situation, da er/try-expand-listsie in externa definiert ist. Bibliothek expand-regionunter http://elpa.gnu.org

Meine Modusregistererweiterung zur expand-regionBibliothek, aber es ist in Ordnung, meinen Modus ohne expand-regionModus auszuführen .

Ich denke, dass der richtige Weg, mit Warnungen umzugehen, darin besteht, eine Erklärung hinzuzufügen:

(defvar er/try-expand-list)

defvar Dokumente sagen:

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

Ich benutze -*- lexical-binding: t -*-. Bedeutet das, dass ohne defvarVariable er/try-expand-listim lexikalischen Bereich ist und ich einen echten Fehler habe?

Gavenkoa
quelle
2
Randnotiz: Sie sollten das Symbol in der nicht zitieren (defvar er/try-expand-list).
JeanPierre
@ JeanPierre behoben.
Gavenkoa

Antworten:

10

Nein, setund setqdeklarieren Sie keine lexikalischen Variablen. Nur lettut. Wenn Sie lethier verwendet hätten, hätten Sie einen Fehler, aber das ist in Ordnung. Die Warnung dient hauptsächlich dazu, Tippfehler bei der Verwendung dynamischer Variablen abzufangen.

Um die Warnung zu entfernen, verwenden Sie sie defvarwie in Ihrer Frage, zitieren Sie das Symbol jedoch nicht .

Mondhorn
quelle
Ist das Einwickeln in nur eval-when-compileüberflüssig defvar? Ich sehe keine Warnung ohne eval-when-compile. Scheint eval-when-compilenotwendig zu sein, wenn aktiver Code verwendet wird, wie (require ...)...
Gavenkoa
3
Das Umwickeln von defvar wäre überflüssig.
Mondhorn