मैंने बस अपने कोड के साथ क्या गलत था यह पता लगाने में उम्र बिताई। यह ert इकाई परीक्षणों में बस ठीक काम करता था, लेकिन जब मैंने इसे बड़े संदर्भ में चलाया तो असफल रहा। यहां एक कोड का एक उदाहरण दिया गया है जो काम करता है:कोड-टेम्प-बफर में कोड शून्य चर के बारे में शिकायत क्यों करता है जब "पैरेंट" बफर के पास उसी नाम के स्थानीय चर होते हैं जो मैंने बाध्य किया है?
(defun func (my-var)
(with-temp-buffer
(message my-var)))
(func "z")
यह प्रिंट जेड अपेक्षित है। अब मैं एक प्रमुख मोड लिख रहा था जिसमें कुछ बफर-स्थानीय चर थे। इनमें से एक मेरा-var था। यह कोड मेरी समस्या का प्रदर्शन करता है:
(make-local-variable 'my-var)
(setq my-var "y")
(defun func (my-var)
(with-temp-buffer
(message my-var)))
(func "z")
आउटपुट? कोई नहीं, केवल यह त्रुटि संदेश है:
eval-buffer: Symbol's value as variable is void: my-var
इस उदाहरण में यह देखने के लिए कि बफर-स्थानीय चर के साथ गतिशील रूप से मेरी-वर बाध्य किसी भी तरह दखल देती आसान है। यह बहुत आसान नहीं था जब मेरे पास कई स्क्रीन के लायक कोड थे :-)
तो मेरा प्रश्न वास्तव में यहां क्या चल रहा है? यह स्पष्ट है कि temp-buffer किसी भी तरह से "पैरेंट" बफर से एक चर प्राप्त करता है, लेकिन इसका शून्य मान क्यों है? मैं समझूंगा कि अगर यह किसी भी तरह का मान "वाई" प्राप्त करेगा, लेकिन यह व्यवहार मुझे एक बग जैसा लगता है।
पीएस। मैं नवीनतम एक्वामाक्स
लेकिन मैं अभी भी समझ में नहीं आता क्यों यह शून्य है। मैं इसे इसके साथ बना देता हूं: (मेक-लोकल-वेरिएबल माई-var) और फिर मैं इसे "y" मान सेट करता हूं: (setq my-var "y")। तो जब तक मैं फ़ंक्शन को कॉल करता हूं और मूल्य के साथ-temp-buffer मैक्रो को शून्य नहीं होना चाहिए। मैं क्या खो रहा हूँ? – auramo
"दूसरे शब्दों में, यह केवल उन बफर में बाध्यकारी है जिसमें इसे स्पष्ट रूप से सेट किया गया है।" <- मैंने इसे मैक्रो-टेम्प-बफर के भीतर बनाए गए अस्थायी-बफर में स्पष्ट रूप से सेट नहीं किया है। बफर किसी भी तरह चर को विरासत में मिला लेकिन यह मूल्य नहीं है। इसके अलावा, अगर मैं इससे बच सकता हूं तो मैं एक वैश्विक चर बनाना नहीं चाहता हूं। मैं इस सुविधा के साथ बस ठीक रह सकता हूं, मुझे चर को सावधानी से नाम देना याद रखना होगा। मैं सिर्फ यह जानना चाहता हूं कि ऐसा क्यों होता है। – auramo
दरअसल, आपके कोड में कुछ चीजें यहां चल रही हैं, मैं अपना जवाब अपडेट करूंगा। –