Seperti jawaban yang lain katakan, ini hanya cara defvar bekerja, tetapi Anda dapat mengatasinya, ini adalah hal yang paling sulit.
Anda dapat mendefinisikan kembali sementara bagaimana defvar bekerja jika Anda ingin dan selama waktu itu, memuat ulang paket yang ingin Anda atur ulang.
Saya menulis makro di mana selama evaluasi tubuh, nilai-nilai defvars akan selalu dievaluasi kembali.
(defmacro my-fake-defvar (name value &rest _)
"defvar impersonator that forces reeval."
`(progn (setq ,name ,value)
',name))
(defmacro with-forced-defvar-eval (&rest body)
"While evaluating, any defvars encountered are reevaluated"
(declare (indent defun))
(let ((dv-sym (make-symbol "old-defvar")))
`(let ((,dv-sym (symbol-function 'defvar)))
(unwind-protect
(progn
(fset 'defvar (symbol-function 'my-fake-defvar))
,@body)
(fset 'defvar ,dv-sym)))))
Contoh penggunaan:
file_a.el
(defvar my-var 10)
file_b.el
(with-forced-defvar-eval
(load-file "file_a.el")
(assert (= my-var 10))
(setq my-var 11)
(assert (= my-var 11)
(load-file "file_a.el")
(assert (= my-var 10))
Catatan: Ini hanya digunakan untuk tujuan mengevaluasi kembali defvars, karena hanya mengabaikan dokumen ketika mengevaluasi ulang. Anda dapat memodifikasi makro untuk mendukung evaluasi ulang yang menerapkan dokumen juga, tapi saya akan menyerahkannya kepada Anda.
Dalam kasus Anda, Anda bisa melakukannya
(with-forced-defvar-eval (require 'some-package))
Tapi ketahuilah apa yang dilakukan oleh elisp agar mengharapkan defvar berfungsi seperti yang ditentukan, bisa jadi mereka menggunakan defvar untuk mendefinisikan dan setq dalam beberapa fungsi init untuk menentukan nilainya, sehingga Anda bisa berakhir dengan nil'ing variabel yang tidak Anda inginkan tetapi ini mungkin jarang terjadi.
Implementasi Alternatif
Dengan menggunakan ini, Anda bisa mendefinisikan ulang defvar secara global dan mengontrol apakah itu akan menetapkan nilai simbol ke argumen INIT-VALUE bahkan jika simbol tersebut didefinisikan dengan mengubah nilai defvar-always-reeval-values
simbol baru .
;; save the original defvar definition
(fset 'original-defvar (symbol-function 'defvar))
(defvar defvar-always-reeval-values nil
"When non-nil, defvar will reevaluate the init-val arg even if the symbol is defined.")
(defmacro my-new-defvar (name &optional init-value docstring)
"Like defvar, but when `defvar-always-reeval-values' is non-nil, it will set the symbol's value to INIT-VALUE even if the symbol is defined."
`(progn
(when defvar-always-reeval-values (makunbound ',name))
(original-defvar ,name ,init-value ,docstring)))
;; globally redefine defvar to the new form
(fset 'defvar (symbol-function 'my-new-defvar))
makunbound
dan kemudian mengevaluasi kembali kode dalam buffer.