2010-08-26 9 views
6

क्या आप मुझे गतिशील रूप से स्कॉप्ड लिस्प्स के लिए अनुपयुक्त कार्यों के कुछ उदाहरण दे सकते हैं? मैं यह देखने में नाकाम रहा हूं कि लेक्सिकल गुंजाइश कितनी बेहतर है और न केवल कोडिंग शैली को बदलने का मामला है, इसलिए मुझे कुछ कोड करना और अपनी आंखों से देखना अच्छा लगेगा।डायनामिक स्कोपिंग के लिए अनुपयुक्त कार्य

धन्यवाद!

उत्तर

7
(define (add n) (lambda (m) (+ n m))) 
(define add4 (add 4)) 
(map (add 7) (list 1 2 3)) 

लेकिन यह सिर्फ एक छोटा यादृच्छिक उदाहरण है। यदि आप काफी दूर खुदाई करते हैं, तो आपको कई अतिरिक्त कारण मिलेंगे। अधिक व्यापक चर्चा के लिए, आपको वास्तव में कुछ पाठ्यपुस्तकों के माध्यम से जाना चाहिए। इसके लिए मेरी सिफारिश PLAI होगी।

यहाँ एक और प्रदर्शन है:

(define tax 0.17) 
(define (add-tax amt) (+ amt (* amt tax))) 

यह add-tax की तरह दिखता है एक समारोह है कि सही कर की दर के साथ निश्चित राशि जोड़ा रिटर्न है - लेकिन आप इस मामले जा रहा है पर भरोसा नहीं कर सकते। उदाहरण के लिए, इसे इस तरह कहा जा सकता है:

(let ((tax -0.17)) (add-tax 100)) 

और आपको पूरी तरह गलत जवाब मिलेंगे। लेकिन चीजें और भी बदतर हैं यदि आपकी भाषा वास्तव में गतिशील रूप से स्कॉप्ड है: आप पर किसी भी बाध्यकारी पर भरोसा नहीं कर सकते हैं। इस पर विचार करें:

(let ((+ -)) (add-tax 100)) 

और btw elisp और सीएल तो सीधे एक डबल नाम स्थान जैसी चीजों का उपयोग कर इस समस्या से ग्रस्त नहीं है, है, और पीछा के बारे में नियम बाइंडिंग "में बनाया"।

+1

डायनामिक रूप से रिबंडिंग फ़ंक्शंस ज्यादातर सीएल में नहीं किए जाते हैं, क्योंकि सीएल डिफ़ॉल्ट रूप से कार्यों के लिए लेक्सिकल बाध्यकारी का उपयोग करता है। एलिसप से अलग, जिसमें कोई भी झुकाव बाध्यकारी नहीं है। –

0

scope पर विकिपीडिया लेख पढ़ने योग्य है।

कार्यात्मक रूप से, यह केवल तभी महत्वपूर्ण होता है जब आपके पास वेरिएबल होते हैं जो वर्तमान दायरे में बंधे नहीं होते हैं। इसलिए, यदि आपके पास कोई मुफ्त चर नहीं है, तो इससे कोई फर्क नहीं पड़ता।

एलिज़ बरज़ील के answer एक समारोह के साथ लैम्ब्डा का एक अच्छा उदाहरण है जिसमें एक प्रतीक (n) है जो गतिशील/स्थिर दायरे में एक अलग बाध्यकारी होगा।

जो मुझे पता है, लेक्सिकल स्कॉइंग वाले भाषाओं को थोड़ा और संकलित किया जा सकता है, क्योंकि संकलन समय पर संकलक गतिशील दायरे के विपरीत सभी चर संदर्भों को निर्धारित कर सकता है, जो रन-टाइम पर परिवर्तनीय संदर्भ को देखना चाहिए ।

+0

मैंने लिखा 'लैम्ब्डा' अभिव्यक्ति * * के पास कोई अनबाउंड पहचानकर्ता नहीं है - * यदि * आपके पास शब्दावली का दायरा है। यदि आप नहीं करते हैं, तो कोई भी पहचानकर्ता या तो बाध्य है या नहीं - आपको इसे कॉल करने के तरीके के अनुसार। –

+0

@EliBarzilay सही, मैं स्पष्ट करता हूं कि मेरा क्या मतलब था। –

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