অন্যান্য উত্তরগুলির মতো বলুন, এটি ডিভভর ঠিক ঠিক কাজ করে তবে আপনি তার চারপাশে পেতে পারেন, এটি সর্বোপরি এলিস্প।
আপনি অস্থায়ীভাবে ডিফভার কীভাবে কাজ করে তা পুনরায় সংজ্ঞায়িত করতে পারেন যদি আপনি চান এবং সেই সময়ে, আপনি যে প্যাকেজগুলি পুনরায় সেট করতে চান তা পুনরায় লোড করুন।
আমি একটি ম্যাক্রো লিখেছিলাম যেখানে শরীরের মূল্যায়নের সময়, ডিফভার্স মানগুলি সর্বদা পুনরায় মূল্যায়ন করা হবে।
(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))
তবে জেনে নিন যারা এলিস্প লেখেন তারা নির্দিষ্ট হিসাবে ডিফভারের কাজ করার প্রত্যাশা করে কী করে, তারা মান নির্দিষ্ট করতে কোনও ডিআই ফাংশনে ডিফভার ব্যবহার করতে পারেন এবং সেটাক ব্যবহার করতে পারেন, তাই আপনি নির্ধারিত ভেরিয়েবলগুলি শেষ করতে পারেন তবে এটি সম্ভবত বিরল।
বিকল্প বাস্তবায়ন
এটি ব্যবহার করে আপনি কেবল বিশ্বব্যাপী ডিভ্যাওয়ারকে নতুনভাবে সংজ্ঞায়িত করতে পারেন এবং এটি প্রতীকটির মানটি INIT-VALUE আর্গে সেট করবে কিনা তা নিয়ন্ত্রণ করতে পারবেন এমনকি যদি নতুন 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
বাফারে কোডটি পুনরায় মূল্যায়ন করে তাদের মানগুলি মুছে ফেলতে পারেন ।