defvar
не переназначает значение переменной так же, как, скажем,
setq
или setf
. Как только переменная имеет значение, defvar
не будет ее трогать.
Из defvar
документации:
(defvar SYMBOL &optional INITVALUE DOCSTRING)
Определите SYMBOL как переменную и верните SYMBOL.
...
Необязательный аргумент INITVALUE оценивается и используется для установки SYMBOL, только если значение SYMBOL равно void. Если SYMBOL является локальным по отношению к буферу, его значением по умолчанию является то, что установлено; локальные значения буфера не затрагиваются. Если значение INITVALUE отсутствует, значение SYMBOL не устанавливается.
...
Поскольку вы предположительно defvar
редактировали эти переменные, чтобы дать им значения при первой загрузке библиотеки, повторная загрузка библиотеки не изменит значения.
См. Также узел руководства elisp по
определению глобальных переменных .
Вместо того чтобы полагаться defvar
, вы всегда можете переназначить значения с помощью setq
. В качестве альтернативы, неуклюжий вариант, вы можете unintern
символы, чтобы defvar
они не нашли их при перезагрузке:
(defvar test-1 "test this")
(defvar test-2 "test this one, too")
test-1 ; => "test this"
test-2 ; => "test this one, too"
(defvar test-1 "trying to redefine")
(defvar test-2 "trying to redefine, too")
test-1 ; => "test this"
test-2 ; => "test this one, too"
(mapc #'unintern '(test-1 test-2))
test-1 ; => error!
test-2 ; => error!
(defvar test-1 "trying to redefine")
(defvar test-2 "trying to redefine, too")
test-1 ; => "trying to redefine"
test-2 ; => "trying to redefine, too"
(unload-feature 'myname)
сначала?