एक आलसी कार्यात्मक भाषा को कार्यान्वित करते समय, मूल्यों को असुविधाकृत चूंकों के रूप में संग्रहित करने के लिए आवश्यक है, जो केवल तभी आवश्यक हो जब मूल्यांकन किया जाए।
एक कुशल कार्यान्वयन की चुनौतियों में से एक, जैसा कि उदाहरण में चर्चा की गई स्पिनलेस टैगलेस जी-मशीन यह है कि यह मूल्यांकन प्रत्येक थंब के लिए केवल एक बार किया जाना चाहिए, और बाद के अभिगमों को गणना मूल्य का पुन: उपयोग करना चाहिए - ऐसा करने में विफलता कम से कम द्विघात मंदी (शायद मुझे अपने सिर के ऊपर से पक्का यकीन नहीं है।) मैं एक सरल उदाहरण कार्यान्वयन की तलाश कर रहा हूं जिसका ऑपरेशन आसानी से समझा जाता है (जैसा कि औद्योगिक-शक्ति कार्यान्वयन के विपरीत है जिसे जीएचसी बनाया गया है सादगी पर प्रदर्शन के लिए) मैं उस मिहनहाकेल में आया था जिसमें निम्न कोड होता है। जैसा कि इसे "एक कुशल व्याख्याता" करार दिया गया है, मैं मानता हूं कि यह वास्तव में केवल एक बार प्रत्येक मूल्यांकन को पूरा करता है और पुन: उपयोग के लिए गणना मूल्य को बचाता है, लेकिन मैं मुझे कहाँ और कैसे देखने में कठिनाई हो रही है; मैं केवल दुभाषिया में ही एक असाइनमेंट स्टेटमेंट देख सकता हूं, और ऐसा नहीं लगता कि यह एक थंब रिकार्ड के हिस्से को ओवरराइट कर रहा है। तो मेरा सवाल यह है, क्या यह वास्तव में ऐसा कैशिंग कर रहा है, और यदि ऐसा है तो कहां और कैसे? (और यदि नहीं, तो सबसे सरल मौजूदा कार्यान्वयन क्या करता है जो ऐसा करता है?) से कोड कुंजी रिकॉर्ड हैं: नोटिस
आरईसी interp env = function दें | वर x - & gt; (चलो आर = List.assoc एक्स env में मैच! आर के साथ VClosure (env ', e) - & gt; वी = interp env' e in r: = v; v | v - & gt; v के साथ not_found - & gt; Runtime_error ("अज्ञात चर" ^ x)) ... आसान सामान काट रहा है ... | ई - ए के रूप में मज़ा _ & gt; VClosure (एनवी, ई) | लागू करें (ई 1, ई 2) - & gt; (एक्सक्लोज़ (एनवी, ई 2))) :: env ') e | _ - & gt; runtime_error "आवेदन में अपेक्षित कार्य") | ई-ए जैसे ए - & gt; VClosure (एनवी, ई) | एफएसटी ई - & gt; (वीक्लोजन (एन्वि ', पेअर (ई 1, ई 2)) के साथ इंटरप एन्वी ई-ई मेल करें - & gt; इंटरप एन्वी' ई 1 | _ - & gt; रनटाइम 'आतंक एसडी ई - & gt; (वीक्लोस (एन्वि ', पेयर (ई 1, ई 2)) के साथ इंटरप एन्वी-ई मैच) - & gt; इंटरप एन्वी' ई 2 | _ - & gt; रनटाइम_रर '' एसडी में अपेक्षित जोडी ") | आरईसी (एक्स, _, ई) - & gt; चलो रिक env '= (एक्स, रेफरी (VClosure (env', e))): interp env 'e में env | निल टी - & gt; वीनिल टी | ई- & gt; VClosure (एनवी, ई) | मैच (ई 1, _, ई 2, एक्स, वाई, ई 3) - & gt; (VNil _ - & gt; इंटरप एन्वि E2 | VClosure (env ', Cons (d1, d2)) के साथ इंटरप एनवाई ई 1 मैच करें - इंटरप ((एक्स, रेफरी (वीक्लोस (एनवी', डी 1))):: y
! R ,
r: = v । जब भी हम पर्यावरण से एक वैरिएबल को खोजते हैं, हम वास्तव में एक रिकॉर्ड वापस लेते हैं, जिसे हम देखते हैं कि क्या यह एक थैंक है। यदि यह एक थैंक है, तो हम इसका मूल्यांकन करते हैं और फिर परिणाम को बचाते हैं। हम आवेदन के दौरान थ्रंक बनाते हैं (
रेफरी कन्स्ट्रक्टर को कॉल देखें), पुनरावर्ती परिभाषाएं और पैटर्न मेलिंग, क्योंकि वे बाइनेंड व्हेरिएबल बनाते हैं।
Comments
Post a Comment