Diğer yanıtların söylediği gibi, bu defvar'ın çalışma şeklidir, ancak bunun üstesinden gelebilirsiniz, sonuçta bu açıktır.
İsterseniz ve bu süre zarfında defvarın nasıl çalıştığını geçici olarak yeniden tanımlayabilirsiniz, sıfırlamak istediğiniz paketleri yeniden yükleyin.
Vücudun değerlendirilmesi sırasında, defvars değerlerinin her zaman yeniden değerlendirileceği bir makro yazdım.
(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)))))
Örnek Kullanım:
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))
Not: Bu sadece yeniden değerlendirme yaparken sadece docstrings'i görmezden geldiğinden defvarları yeniden değerlendirmek amacıyla kullanılmalıdır. Makroları, dokümanlar için de geçerli olan yeniden değerlendirmeyi desteklemek için değiştirebilirsiniz, ancak bunu size bırakacağım.
Senin durumunda yapabilirsin
(with-forced-defvar-eval (require 'some-package))
Ancak elisp yazanların defvar'ın belirtildiği gibi çalışmasını beklediklerini biliyorlar, değeri belirtmek için bazı init fonksiyonlarında tanımlamak ve setq olarak tanımlamak için defvar kullanıyor olabilirler, bu yüzden niyet etmeyeceğiniz değişkenleri bitirebilirsiniz. Bu muhtemelen nadirdir.
Alternatif Uygulama
Bunu kullanarak defvar'ı global olarak yeniden tanımlayabilir ve sembolün değerini, yeni defvar-always-reeval-values
sembolün değerini değiştirerek tanımlanmış olsa bile sembolün değerini INIT-VALUE değişkenine ayarlayıp ayarlamayacağını kontrol edebilirsiniz .
;; 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
ve ardından arabellekteki kodu yeniden değerlendirebilirsiniz.