defvarне перепризначає значення змінної так само, як, скажімо,
setqабо setf. Коли змінна має значення, defvar
її не торкнеться.
З defvar's docstring:
(defvar SYMBOL &optional INITVALUE DOCSTRING)
Визначте SYMBOL як змінну та поверніть SYMBOL.
...
Необов'язковий аргумент INITVALUE оцінюється та використовується для встановлення SYMBOL, лише якщо значення SYMBOL недійсне . Якщо SYMBOL буферно-локальний, його значенням за замовчуванням є те, що встановлено; локальні значення буфера не впливають. Якщо INITVALUE відсутня, значення SYMBOL не встановлено.
...
Оскільки ви, ймовірно, defvarредагували вказані змінні, щоб надати їм значення під час першого завантаження бібліотеки, повторна завантаження бібліотеки не змінить значення.
Дивіться також вузол посібника elisp щодо
визначення глобальних змінних .
Замість того, щоб покладатися на це defvar, ви завжди можете перепризначити значення за допомогою setq. Як альтернатива, незграбний варіант, ви можете uninternвикористовувати символи, щоб defvars не знайшов їх при перезавантаженні:
(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)спочатку?