Como dicen las otras respuestas, esta es la forma en que defvar funciona, pero puedes evitarlo, después de todo, es elisp.
Puede redefinir temporalmente cómo funciona defvar si lo desea y, durante ese tiempo, volver a cargar los paquetes que desea restablecer.
Escribí una macro donde durante la evaluación del cuerpo, los valores de defvars siempre serán reevaluados.
(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)))))
Ejemplo de uso:
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))
Nota: Esto solo debe usarse con el propósito de reevaluar los defvars, ya que simplemente ignora las cadenas de documentos al reevaluar. Puede modificar la macro para admitir la reevaluación que también aplica docstrings, pero se lo dejaré a usted.
En tu caso podrías hacer
(with-forced-defvar-eval (require 'some-package))
Pero sepa lo que hacen los que escriben elisp esperando que defvar funcione como se especifica, podría ser que usan defvar para definir y establecer q en alguna función de inicio para especificar el valor, por lo que puede terminar con variables nulas que no pretende pero Esto es probablemente raro.
Implementación Alternativa
Con esto, puede redefinir defvar globalmente y controlar si establecerá o no el valor del símbolo en el argumento INIT-VALUE incluso si el símbolo se define cambiando el valor del nuevo defvar-always-reeval-values
símbolo.
;; 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
y luego volver a evaluar el código en el búfer.