2012-01-25 7 views
7

मैंने बस अपने कोड के साथ क्या गलत था यह पता लगाने में उम्र बिताई। यह 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 किसी भी तरह से "पैरेंट" बफर से एक चर प्राप्त करता है, लेकिन इसका शून्य मान क्यों है? मैं समझूंगा कि अगर यह किसी भी तरह का मान "वाई" प्राप्त करेगा, लेकिन यह व्यवहार मुझे एक बग जैसा लगता है।

पीएस। मैं नवीनतम एक्वामाक्स

उत्तर

3

कुछ चीजें चला रहा हूं।

पहला, आपका कोड इस तरह काम नहीं करता है। आपको Emacs के नए आमंत्रण में इसे आज़माएं। एक बार जब आप ऐसा करेंगे, तो आप देखेंगे कि आप make-local-variable प्रतीक पारित करने के लिए है, इसलिए की तरह की जरूरत है:

(make-local-variable 'my-var) 

नोट `` `।

दूसरा, आपने func पर पैरामीटर के समान नाम रखने के लिए एक बफर-स्थानीय चर परिभाषित किया है, इसलिए किसी भी उत्तर को दोनों के बीच अंतर करने की आवश्यकता है।

तो, यहाँ अपने उदाहरण की मेरी साफ संस्करण है:

(make-local-variable 'my-var) 
(setq my-var "y") 

(defun func (my-param) 
    (with-temp-buffer 
(message my-param))) 

(func "z") 

और यह ठीक काम करता है।

जो मुझे विश्वास दिलाता है कि आप जो त्रुटि देख रहे हैं वह make-local-variable पर my-var के सामने उद्धरण के बिना है।


चेक बाहर make-local-variable के लिए दस्तावेज़: हालांकि यह समस्या का समाधान नहीं करता है

मूल जवाब है, नीचे प्रदान की। दस्तावेज़ स्ट्रिंग है:

मेक-लोकल-वेरिएबल 'सी स्रोत कोड' में एक इंटरैक्टिव अंतर्निहित फ़ंक्शन है।

(मेकअप स्थानीय-चर चर)

VARIABLE वर्तमान बफर में एक अलग मूल्य किया हुआ है। अन्य बफर एक सामान्य डिफ़ॉल्ट मान साझा करना जारी रखेंगे।( VARIABLE का बफर-स्थानीय मान पहले वैरिएबल के समान मूल्य के रूप में शुरू होता है। यदि VARIABLE शून्य था, तो यह शून्य रहता है।) VARIABLE लौटें।

आपके लिए मुख्य भाग अंतिम वाक्य है। If the variable was void, it remains void.

इसका मतलब है कि यदि यह पहले से ही वैश्विक रूप से परिभाषित नहीं किया गया था, तो यह अभी भी वैश्विक रूप से परिभाषित नहीं है। दूसरे शब्दों में, यह केवल उन बफर में बाध्यकारी है जिसमें इसे स्पष्ट रूप से सेट किया गया है।

आप इसे एक वैश्विक मूल्य चाहते हैं, तो जैसे setq-default का उपयोग करें:

(setq-default my-var "some-default-value") 
+0

लेकिन मैं अभी भी समझ में नहीं आता क्यों यह शून्य है। मैं इसे इसके साथ बना देता हूं: (मेक-लोकल-वेरिएबल माई-var) और फिर मैं इसे "y" मान सेट करता हूं: (setq my-var "y")। तो जब तक मैं फ़ंक्शन को कॉल करता हूं और मूल्य के साथ-temp-buffer मैक्रो को शून्य नहीं होना चाहिए। मैं क्या खो रहा हूँ? – auramo

+0

"दूसरे शब्दों में, यह केवल उन बफर में बाध्यकारी है जिसमें इसे स्पष्ट रूप से सेट किया गया है।" <- मैंने इसे मैक्रो-टेम्प-बफर के भीतर बनाए गए अस्थायी-बफर में स्पष्ट रूप से सेट नहीं किया है। बफर किसी भी तरह चर को विरासत में मिला लेकिन यह मूल्य नहीं है। इसके अलावा, अगर मैं इससे बच सकता हूं तो मैं एक वैश्विक चर बनाना नहीं चाहता हूं। मैं इस सुविधा के साथ बस ठीक रह सकता हूं, मुझे चर को सावधानी से नाम देना याद रखना होगा। मैं सिर्फ यह जानना चाहता हूं कि ऐसा क्यों होता है। – auramo

+0

दरअसल, आपके कोड में कुछ चीजें यहां चल रही हैं, मैं अपना जवाब अपडेट करूंगा। –