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-list
sie in externa definiert ist. Bibliothek expand-region
unter http://elpa.gnu.org
Meine Modusregistererweiterung zur expand-region
Bibliothek, aber es ist in Ordnung, meinen Modus ohne expand-region
Modus 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 defvar
Variable er/try-expand-list
im lexikalischen Bereich ist und ich einen echten Fehler habe?
(defvar er/try-expand-list)
.Antworten:
Nein,
set
undsetq
deklarieren Sie keine lexikalischen Variablen. Nurlet
tut. Wenn Sielet
hier 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
defvar
wie in Ihrer Frage, zitieren Sie das Symbol jedoch nicht .quelle
eval-when-compile
überflüssigdefvar
? Ich sehe keine Warnung ohneeval-when-compile
. Scheinteval-when-compile
notwendig zu sein, wenn aktiver Code verwendet wird, wie(require ...)
...