defvar
ne réaffecte pas la valeur d'une variable de la même manière que, disons
setq
ou setf
. Une fois qu'une variable a une valeur, defvar
ne la touchez pas.
Du defvar
docstring de:
(defvar SYMBOL &optional INITVALUE DOCSTRING)
Définissez SYMBOL en tant que variable et renvoyez SYMBOL.
...
L'argument facultatif INITVALUE est évalué et utilisé pour définir SYMBOL, uniquement si la valeur de SYMBOL est nulle. Si SYMBOL est buffer-local, sa valeur par défaut est celle qui est définie; les valeurs locales du tampon ne sont pas affectées. Si INITVALUE est manquant, la valeur de SYMBOL n'est pas définie.
...
Comme vous avez probablement defvar
édité les variables en question pour leur donner des valeurs lors du premier chargement de la bibliothèque, le rechargement de la bibliothèque ne changera pas les valeurs.
Voir aussi le nœud manuel elisp sur la
définition des variables globales .
Au lieu de vous fier à defvar
, vous pouvez toujours réaffecter des valeurs avec setq
. Comme alternative, une option maladroite, vous pouvez unintern
les symboles afin que les defvar
s ne les trouvent pas lors du rechargement:
(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)
abord?