macros - जब मैं मैक्रो को परिभाषित करता हूं और अस्थायी चर के लिए दुर्लभ पर्याप्त नाम का उपयोग करता हूं तो क्या गलत हो सकता है?




lisp scope (2)

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

मैं एक ऐसे उदाहरण के बारे में सोच सकता हूं जिसे बंद करने का उपयोग करते हुए एक वेरिएबल को एक संलग्न (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

लम्ब्डा अध्याय 3 खंड 'अवांछित कैद' कहने पर कहें :

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

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

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


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