कैसे letrec
set!
का उपयोग किए बिना लागू किया जा सकता?"सेट!" का उपयोग किए बिना "letrec" कैसे कार्यान्वित किया जाता है?
ऐसा लगता है कि set!
एक अनिवार्य प्रोग्रामिंग निर्माण है, और इसका उपयोग करके, कोई कार्यात्मक प्रोग्रामिंग के लाभ खो देता है।
कैसे letrec
set!
का उपयोग किए बिना लागू किया जा सकता?"सेट!" का उपयोग किए बिना "letrec" कैसे कार्यान्वित किया जाता है?
ऐसा लगता है कि set!
एक अनिवार्य प्रोग्रामिंग निर्माण है, और इसका उपयोग करके, कोई कार्यात्मक प्रोग्रामिंग के लाभ खो देता है।
मैं जानता हूँ कि आमतौर पर हम कॉपी किया जा करने के लिए सामग्री पूछना लेकिन वहाँ अपने प्रश्न का कोई संक्षिप्त उत्तर है। http://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf
नहीं। सिर्फ इसलिए कि एक कार्यात्मक सुविधा पर्दे के पीछे जरूरी कोड, कि सुविधा अनिवार्य होना नहीं है के साथ किया जाता है। हमारी कंप्यूटिंग मशीन सभी जरूरी हैं; इसलिए किसी बिंदु पर सभी कार्यात्मक कोड को अनिवार्य कोड में अनुवाद द्वारा कार्यान्वित किया जाना चाहिए!
यहाँ समझने के लिए मुख्य बात यह है: कार्यात्मक प्रोग्रामिंग, इंटरफ़ेस से संबंधित है कार्यान्वयन के लिए नहीं। अगर है कि कोड में ही असमर्थ है निरीक्षण करने के लिए कोई साइड इफेक्ट है-भले ही साइड इफेक्ट तथ्य पर्दे के पीछे हो रहा में हैं कोड का एक टुकड़ा कार्यात्मक है। अर्थात, और यदि आप एक ही चर कई बार एक ही बंधन का मूल्य की जाँच करें, आप एक ही मिल जाएगा मूल्य-भले ही वह मूल्य, पर्दे के पीछे, वहाँ set!
के उपयोग के द्वारा रखा गया था।
letrec
के मामले में, यहां थोड़ा सा पकड़ है: letrec
में किसी भी बाइंडिंग का मूल्यांकन किसी और को अपमानित करने का कारण बनता है, तो परिणाम अपरिभाषित होता है। तो, यह कोड का परिणाम अपरिभाषित है:
(letrec ((foo bar)
(bar 7))
(cons foo bar))
letrec के शरीर में foo
का मूल्य अनिर्धारित रहता है। निम्नलिखित का परिणाम है, दूसरे हाथ पर, परिभाषित किया गया है:
(letrec ((foo (lambda() bar))
(bar 7))
(cons (foo) bar))
इसका कारण यह है lambda
का मूल्यांकन संदर्भ बार कब्जा है, लेकिन वास्तविक मूल्य ऊपर देखा नहीं है जब तक बंद करने से शरीर में क्रियान्वित किया जाता है।
Dybvig एट अल। कागज एक अच्छा है। कुछ साल पहले लैम्ब्डा के मामले में लेट्रेक को लागू करने के बारे में कुछ भी अच्छी तरह से [लैम्ब्डा परम पर चर्चा] (http://lambda-the-ultimate.org/node/2971) भी है। (यह सब कहकर, मैं सकुंडिम की टिप्पणी से सहमत हूं कि "सिर्फ इसलिए कि दृश्यों के पीछे अनिवार्य कोड के साथ एक कार्यात्मक विशेषता लागू की गई है, जो सुविधा को अनिवार्य नहीं बनाती है।") –