Wie die anderen Antworten sagen, funktioniert defvar so, aber man kann es umgehen, das ist doch ein Elisp.
Sie können die Funktionsweise von defvar vorübergehend neu definieren und in dieser Zeit die Pakete neu laden, die Sie zurücksetzen möchten.
Ich habe ein Makro geschrieben, in dem während der Auswertung des Körpers defvars-Werte immer neu bewertet werden.
(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)))))
Beispiel Verwendung:
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))
Hinweis: Dies sollte nur zum Zwecke der Neubewertung von Defvars verwendet werden, da Docstrings bei der Neubewertung nur ignoriert werden. Sie können das Makro so ändern, dass es auch die erneute Auswertung von Dokumentzeichenfolgen unterstützt, aber das überlasse ich Ihnen.
In Ihrem Fall könnten Sie tun
(with-forced-defvar-eval (require 'some-package))
Aber wissen Sie, was diejenigen, die elisp schreiben, tun, wenn sie erwarten, dass defvar wie angegeben funktioniert. Es könnte sein, dass sie defvar verwenden, um in einer Init-Funktion den Wert zu definieren und setq zu setzen, so dass Sie möglicherweise keine Variablen erhalten, die Sie nicht beabsichtigen, aber das ist wahrscheinlich selten.
Alternative Implementierung
Mit dieser Option können Sie defvar einfach global neu definieren und steuern, ob der Wert des Symbols auf das INIT-VALUE-Argument gesetzt wird, auch wenn das Symbol durch Ändern des Werts des neuen defvar-always-reeval-values
Symbols definiert wird.
;; 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
und den Code im Puffer neu auswerten.