Radzenie sobie z „Ostrzeżenie: przypisanie do zmiennej swobodnej”, gdy pewne biblioteki mogą być projektowane

12

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-listjest zdefiniowana w externa; biblioteka, expand-regionktóra znajduje się na stronie http://elpa.gnu.org

Mój tryb rejestruje rozszerzenie do expand-regionbiblioteki, ale można uruchomić mój tryb bez expand-regiontrybu.

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 defvarzmiennej er/try-expand-listjest w zakresie leksykalnym i mam prawdziwy błąd?

gavenkoa
źródło
2
Uwaga dodatkowa: nie należy cytować symbolu w (defvar er/try-expand-list).
JeanPierre
@JeanPierre Naprawiono.
gavenkoa

Odpowiedzi:

10

Nie seti setqnie deklaruj zmiennych leksykalnych. Tylko letrobi. Gdybyś lettu 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 defvarjak w pytaniu, ale nie cytuj symbolu.

księżycowy
źródło
Czy owijanie staje się eval-when-compilezbędne defvar? Nie widzę ostrzeżenia bez eval-when-compile. Wydaje się eval-when-compileto konieczne, jeśli używa się aktywnego kodu, takiego jak (require ...)...
gavenkoa
3
Zawijanie defvar byłoby zbędne.
lunaryorn