defvar
不会以与say setq
或相同的方式重新分配变量的值
setf
。一旦变量具有值,defvar
就不要触摸它。
来自defvar
的文档字符串:
(defvar SYMBOL &optional INITVALUE DOCSTRING)
将SYMBOL定义为变量,然后返回SYMBOL。
...
仅当SYMBOL的值为void时,才对可选参数INITVALUE进行评估,并用于设置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)
第一个?