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
використовувати символи, щоб defvar
s не знайшов їх при перезавантаженні:
(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)
спочатку?