2013-07-02 3 views
8

Let Over Lambda Chapter 3 Section 'Unwanted Capture' का कहना है:।।मैक्रो को परिभाषित करते समय गलत क्या हो सकता है और अस्थायी चर के लिए दुर्लभ पर्याप्त नाम का उपयोग करें?

"निश्चित रूप से हम दुर्लभ पर्याप्त नामों में से इतना है कि समस्या कभी नहीं दिखाता है हाँ, कई मामलों में, संकुल और स्मार्ट चर नामकरण में चर पर कब्जा की समस्या को हल कर सकते हैं बारे में सोच सकते हालांकि, सबसे गंभीर चर कब्जा कीड़े सीधे एक प्रोग्रामर द्वारा बनाई कोड में पैदा नहीं है। अधिकांश चर कब्जा समस्याओं केवल सतह जब अन्य मैक्रो का उपयोग अपने मैक्रो तरीकों से (अपने मैक्रो के साथ गठबंधन) आपको अनुमान नहीं था। "

और फिर इसे मुझे बोल्ड हिस्से के लिए एक उदाहरण नहीं देता है। ऐसे उदाहरणों में से एक क्या होगा? कल्पना कीजिए कि एक पागल बॉस देव टीम जहां उसके पागल मालिक ने जीन्सिम या किसी भी चीज का उपयोग प्रतिबंधित किया है जो अनियंत्रित प्रतीकों का निर्माण करता है और प्रोग्रामर आसानी से अल्फान्यूमेरिक पासा फेंकने का सहारा लेते हैं जैसे कि temp-27s63f8sk2n या sum-3t84hj4df जैसे वे gensym याद करते हैं। एक उदाहरण क्या होगा जहां टीम को परेशानी होगी?

जिसमें से बोलते हुए, Emacs 24.3.1 बिना संकेतित प्रतीकों का उपयोग किये बिना डॉटिम्स और डॉलीस्ट को परिभाषित करता है। अजीब।

+6

लोग इसे बंद करने के लिए क्यों मतदान कर रहे हैं? यह एक वास्तविक और जटिल सवाल है। – d11wtq

उत्तर

1

समस्या तब उत्पन्न होती है जब आप किसी अन्य संदर्भ में अपने मैक्रो का पुन: उपयोग करते हैं और आपके चालाकी से नामित चर प्रभावी ढंग से अनावश्यक होते हैं, क्योंकि वे सभी एक ही नामस्थान पर हैं।

मैं एक उदाहरण है जब एक बंद है कि एक enclosing (let) में एक चर तक पहुँचता का उपयोग कर किया जा रहा है के बारे में सोच सकते हैं, लेकिन एक ऐसा मैक्रो भी एक enclosing (let) का उपयोग करता है एक नाम टकराव के साथ एक "सुरक्षित" चर को परिभाषित करने के लिए पारित किया गया है। यह एक प्रत्याशित उदाहरण है, क्षमा करें, मैं अभी असली दुनिया के मामले के बारे में नहीं सोच सकता।

(defmacro my/a (x) 
    (let ((my/safe-name x)) 
    `(progn ,(my/b (lambda() my/safe-name)) 
      ,my/safe-name))) 

(defmacro my/b (f) 
    `(let ((my/safe-name 4)) 
    (when (evenp (funcall ,f)) 
     (print "F is even!")))) 

(my/a 3) ; will print "F is even", but it shouldn't 
+0

एक सामान्य देव टीम * दो * जेन्सिम कॉल या मेक-सिंबल कॉल के साथ लिख जाएगी। प्रश्न में hypothetical dev टीम अपने छद्म यादृच्छिक अल्फान्यूमेरिक पोस्टफिक्स जेनरेटर * दो बार * चलाएगी। तो यह होगा ((मेरा/सुरक्षित नाम -6kuyd4kq x)) मेरे/ए में (और (मेरा/सुरक्षित नाम-pqedzkwg 4)) मेरे/बी में। इस टीम को परेशानी में आने के लिए, हमें कोड की आवश्यकता होगी जो किसी भी तरह से मेरे/सुरक्षित-नाम -6kuyd4kq को उठाए और इसे किसी भी तरह से संघर्ष कर सके। मुझे संदेह है कि यह बोल्ड हिस्सा क्या है, सिवाय इसके कि इसमें एक उदाहरण नहीं है, इसलिए मैं सुनिश्चित नहीं हो सकता। –

+0

गैन्सिम का उपयोग करना वास्तव में डॉग होयटे अवांछित कैप्चर के समाधान के रूप में सुझाव देता है। यदि आप लिंग का उपयोग करने की उपेक्षा करते हैं तो आपको केवल समस्याएं हैं। होयटे कहने की कोशिश कर रहा है। पुस्तक में इस बिंदु पर, वह मानते हैं कि आप अभी तक लिंग के बारे में नहीं जानते हैं, केवल हाथ से उठाए गए (लेकिन नामांकित) चर नाम। – d11wtq

2

ठीक है, तो मैं "अल्फान्यूमेरिक पासा फेंकने" की प्रक्रिया को स्वचालित करने का प्रस्ताव दूंगा। बेशक, यह यादृच्छिक नहीं होना चाहिए, आप सिर्फ एक काउंटर का उपयोग कर सकते हैं। इसके अतिरिक्त, डीबगिंग के लिए उपसर्ग निर्दिष्ट करने में सक्षम होना अच्छा होगा। ओह रुको, यह वही है जो gensym करता है।

+0

जेन्सेम अनियंत्रित प्रतीकों को लौटाता है। Hypothetical टीम केवल INTERNED प्रतीकों का उपयोग करता है। यदि टीम 'इंटर्न-जेन्सिम 'पर निर्भर करती है जो' जीन्सिम 'की तरह है, सिवाय इसके कि यह आंतरिक प्रतीक देता है, तो उन्हें परेशानी होगी क्योंकि नाम जी 10, जी 11, जी 12 .... दुर्लभ नहीं हैं, और वहां कुछ भी दुर्लभ नहीं है एक मौका है कि मैक्रोज़ के उपयोगकर्ता ऐसे परिवर्तनीय नामों का उपयोग करेंगे, और इस तरह का एक उदाहरण लैम्ब्डा लेख से जुड़े लेट ओवर में दिया गया है। –

+0

यदि टीम यादृच्छिक पोस्टफिक्स के साथ आंतरिक प्रतीकों का उपयोग करती है, तो ऐसे उदाहरण के मुद्दे से बच सकते हैं। फिर लेख में कहा गया है कि मुसीबत में आने का एक और तरीका है, उद्धरण में बोल्ड हिस्सा। क्या बोल्ड हिस्सा टीम को परेशानी में ला सकता है? –

संबंधित मुद्दे