Байтная компиляция моего режима:
(defun dict-setup-expansions ()
"Add `dict-mode' specific expansions."
(set (make-local-variable 'er/try-expand-list) (list #'dict-mark-article)))
дает предупреждение:
Warning: assignment to free variable `er/try-expand-list'
Это нормальная ситуация, потому что er/try-expand-list
определяется в externa; библиотека, expand-region
которая находится на http://elpa.gnu.org
Мой режим регистрирует расширение для expand-region
библиотеки, но можно запустить мой режим без expand-region
режима.
Я думаю, что правильный способ справиться с предупреждением - добавить объявление:
(defvar er/try-expand-list)
defvar
документы говорят:
The `defvar' form also declares the variable as "special",
so that it is always dynamically bound even if `lexical-binding' is t.
Я использую -*- lexical-binding: t -*-
. Означает ли это, что без defvar
переменной er/try-expand-list
будет в лексической области, и у меня есть реальная ошибка?
(defvar er/try-expand-list)
.Ответы:
Нет,
set
иsetq
не объявляйте лексические переменные. Толькоlet
делает. Если бы вы использовалиlet
здесь, у вас была бы ошибка, но это нормально. Предупреждение существует главным образом для обнаружения опечаток при использовании динамических переменных.Чтобы убрать предупреждение, используйте
defvar
как в вашем вопросе, но не ставьте в кавычки символ.источник
eval-when-compile
излишне простоdefvar
? Я не вижу предупреждения безeval-when-compile
. Кажется, чтоeval-when-compile
это необходимо, если использовать активный код, например(require ...)
...