2011-12-11 7 views
6

कैसे letrecset! का उपयोग किए बिना लागू किया जा सकता?"सेट!" का उपयोग किए बिना "letrec" कैसे कार्यान्वित किया जाता है?

ऐसा लगता है कि set! एक अनिवार्य प्रोग्रामिंग निर्माण है, और इसका उपयोग करके, कोई कार्यात्मक प्रोग्रामिंग के लाभ खो देता है।

उत्तर

9

मैं जानता हूँ कि आमतौर पर हम कॉपी किया जा करने के लिए सामग्री पूछना लेकिन वहाँ अपने प्रश्न का कोई संक्षिप्त उत्तर है। http://www.cs.indiana.edu/~dyb/pubs/fixing-letrec.pdf

+2

Dybvig एट अल। कागज एक अच्छा है। कुछ साल पहले लैम्ब्डा के मामले में लेट्रेक को लागू करने के बारे में कुछ भी अच्छी तरह से [लैम्ब्डा परम पर चर्चा] (http://lambda-the-ultimate.org/node/2971) भी है। (यह सब कहकर, मैं सकुंडिम की टिप्पणी से सहमत हूं कि "सिर्फ इसलिए कि दृश्यों के पीछे अनिवार्य कोड के साथ एक कार्यात्मक विशेषता लागू की गई है, जो सुविधा को अनिवार्य नहीं बनाती है।") –

8

नहीं। सिर्फ इसलिए कि एक कार्यात्मक सुविधा पर्दे के पीछे जरूरी कोड, कि सुविधा अनिवार्य होना नहीं है के साथ किया जाता है। हमारी कंप्यूटिंग मशीन सभी जरूरी हैं; इसलिए किसी बिंदु पर सभी कार्यात्मक कोड को अनिवार्य कोड में अनुवाद द्वारा कार्यान्वित किया जाना चाहिए!

यहाँ समझने के लिए मुख्य बात यह है: कार्यात्मक प्रोग्रामिंग, इंटरफ़ेस से संबंधित है कार्यान्वयन के लिए नहीं। अगर है कि कोड में ही असमर्थ है निरीक्षण करने के लिए कोई साइड इफेक्ट है-भले ही साइड इफेक्ट तथ्य पर्दे के पीछे हो रहा में हैं कोड का एक टुकड़ा कार्यात्मक है। अर्थात, और यदि आप एक ही चर कई बार एक ही बंधन का मूल्य की जाँच करें, आप एक ही मिल जाएगा मूल्य-भले ही वह मूल्य, पर्दे के पीछे, वहाँ set! के उपयोग के द्वारा रखा गया था।

letrec के मामले में, यहां थोड़ा सा पकड़ है: letrec में किसी भी बाइंडिंग का मूल्यांकन किसी और को अपमानित करने का कारण बनता है, तो परिणाम अपरिभाषित होता है। तो, यह कोड का परिणाम अपरिभाषित है:

(letrec ((foo bar) 
     (bar 7)) 
    (cons foo bar)) 

letrec के शरीर में foo का मूल्य अनिर्धारित रहता है। निम्नलिखित का परिणाम है, दूसरे हाथ पर, परिभाषित किया गया है:

(letrec ((foo (lambda() bar)) 
     (bar 7)) 
    (cons (foo) bar)) 

इसका कारण यह है lambda का मूल्यांकन संदर्भ बार कब्जा है, लेकिन वास्तविक मूल्य ऊपर देखा नहीं है जब तक बंद करने से शरीर में क्रियान्वित किया जाता है।

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