जैसे अन्य उत्तर कहते हैं, यह वैसे ही है जैसे डिफावर काम करता है, लेकिन आप इसके चारों ओर प्राप्त कर सकते हैं, यह सब के बाद भी स्पष्ट है।
आप अस्थायी रूप से यह परिभाषित कर सकते हैं कि अगर आप चाहें और उस समय के दौरान डिफावर कैसे काम करता है, तो उन पैकेजों को पुनः लोड करें जिन्हें आप रीसेट करना चाहते हैं।
मैंने एक मैक्रो लिखा है, जहां शरीर के मूल्यांकन के दौरान, डिफ़र्वर्स मानों का हमेशा पुनर्मूल्यांकन किया जाएगा।
(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)))))
उदाहरण उपयोग:
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))
नोट: इसका उपयोग केवल बचाव के पुनर्मूल्यांकन के उद्देश्य के लिए किया जाना चाहिए, क्योंकि यह केवल पुनर्मूल्यांकन करते समय डॉकस्ट्रिंग की उपेक्षा करता है। आप मैक्रो को फिर से मूल्यांकन करने वाले समर्थन का समर्थन करने के लिए मैक्रो को संशोधित कर सकते हैं, लेकिन मैं आपको छोड़ दूंगा।
आपके मामले में आप कर सकते हैं
(with-forced-defvar-eval (require 'some-package))
लेकिन जानते हैं कि जो लोग लिखते हैं, वे लिखते हैं कि डिफावर को उम्मीद के मुताबिक काम करने की ज़रूरत है, यह हो सकता है कि वे परिभाषित करने के लिए डिफवार का इस्तेमाल करें और मूल्य को निर्दिष्ट करने के लिए कुछ इनिट फ़ंक्शन में सेट करें, ताकि आप nil'ing वेरिएबल्स को समाप्त कर सकें जो आप चाहते हैं लेकिन नहीं यह शायद दुर्लभ है।
वैकल्पिक कार्यान्वयन
इसका उपयोग करके आप विश्व स्तर पर केवल डिफ्वेयर को फिर से परिभाषित कर सकते हैं और यह नियंत्रित कर सकते हैं कि यह प्रतीक के मूल्य को INIT-VALUE arg पर सेट करेगा या नहीं, भले ही प्रतीक को नए defvar-always-reeval-values
प्रतीक के मान को बदलकर परिभाषित किया गया हो ।
;; 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
और फिर बफर में कोड का पुनर्मूल्यांकन कर सकते हैं ।