Kompilacja bajtowa mojego trybu:
(defun dict-setup-expansions ()
"Add `dict-mode' specific expansions."
(set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))
daje ostrzeżenie:
Warning: assignment to free variable `er/try-expand-list'
Jest to normalna sytuacja, ponieważ er/try-expand-list
jest zdefiniowana w externa; biblioteka, expand-region
która znajduje się na stronie http://elpa.gnu.org
Mój tryb rejestruje rozszerzenie do expand-region
biblioteki, ale można uruchomić mój tryb bez expand-region
trybu.
Myślę, że właściwym sposobem postępowania z ostrzeżeniem jest dodanie deklaracji:
(defvar er/try-expand-list)
defvar
doktorzy mówią:
The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.
Używam -*- lexical-binding: t -*-
. Czy to oznacza, że bez defvar
zmiennej er/try-expand-list
jest w zakresie leksykalnym i mam prawdziwy błąd?
(defvar er/try-expand-list)
.Odpowiedzi:
Nie
set
isetq
nie deklaruj zmiennych leksykalnych. Tylkolet
robi. Gdybyślet
tu użył , miałbyś błąd, ale to jest w porządku. Ostrzeżenie istnieje głównie w celu przechwytywania literówek podczas używania zmiennych dynamicznych.Aby ostrzeżenie zniknęło, użyj
defvar
jak w pytaniu, ale nie cytuj symbolu.źródło
eval-when-compile
zbędnedefvar
? Nie widzę ostrzeżenia bezeval-when-compile
. Wydaje sięeval-when-compile
to konieczne, jeśli używa się aktywnego kodu, takiego jak(require ...)
...