defvartidak menetapkan ulang nilai variabel dengan cara yang sama seperti, katakan
setqatau setf. Setelah variabel memiliki nilai, defvar
tidak akan menyentuhnya.
Dari defvardokumentasi:
(defvar SYMBOL &optional INITVALUE DOCSTRING)
Tentukan SYMBOL sebagai variabel, dan kembalikan SYMBOL.
...
Argumen opsional INITVALUE dievaluasi, dan digunakan untuk mengatur SYMBOL, hanya jika nilai SYMBOL batal. Jika SYMBOL adalah buffer-local, nilai defaultnya adalah apa yang ditetapkan; nilai buffer-local tidak terpengaruh. Jika INITVALUE hilang, nilai SYMBOL tidak disetel.
...
Karena Anda mungkin defvarmengedit variabel yang bersangkutan untuk memberi mereka nilai saat pertama kali memuat pustaka, memuat ulang pustaka tidak akan mengubah nilai.
Lihat juga simpul manual elisp pada
Mendefinisikan Variabel Global .
Alih-alih mengandalkan defvar, Anda selalu dapat menetapkan ulang nilai setq. Sebagai alternatif, opsi kikuk, Anda dapat uninternsimbol sehingga defvars tidak akan menemukannya saat memuat ulang:
(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)dulu?