defvar
tidak menetapkan ulang nilai variabel dengan cara yang sama seperti, katakan
setq
atau setf
. Setelah variabel memiliki nilai, defvar
tidak akan menyentuhnya.
Dari defvar
dokumentasi:
(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 defvar
mengedit 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 unintern
simbol sehingga defvar
s 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?