2009-12-08 10 views
6

मैं उदाहरण कोड here (उदाहरणों के नीचे) की भावना बनाने की कोशिश कर रहा हूं। मुझे समझ में नहीं आता कि पैरामीट्रिज निर्माण। इसके लिए दस्तावेज़ here हैं, लेकिन वे मदद नहीं करते हैं। यह क्या करता है?डॉ। सेशेम में 'पैरामीट्रिज' क्या करता है?

+0

tinyurl.com का उपयोग क्यों करें? पूर्ण यूआरएल का उपयोग करने पर कोई महत्वपूर्ण स्थान बाधा नहीं है, और शॉर्टनर लिंक को और अधिक संदिग्ध बनाता है। –

+1

लिंक में पीछे की ओर से ब्रांड्स हैं जो उन्हें काम नहीं करते हैं/मार्क-अप जो एसओ – Claudiu

+0

जिमी क्रिसमस का उपयोग करता है, वे लिंक उद्धरण-नीचे-नीचे मार्कडाउन शैली के साथ भी काम नहीं करेंगे। – Chuck

उत्तर

13

parameterize का उपयोग उन मानों के लिए किया जाता है जो "गतिशील रूप से स्कॉप्ड" होते हैं। आपको make-parameter के साथ पैरामीटर मिलता है। पैरामीटर स्वयं फ़ंक्शन के रूप में व्यवहार करता है: इसे बिना इनपुट के कॉल करें और आपको इसका मान मिलता है, इसे एक मान के साथ कॉल करें और यह मान निर्धारित करेगा। उदाहरण के लिए:

> (define p (make-parameter "blah")) 
> (p) 
"blah" 
> (p "meh") 
> (p) 
"meh" 

कई कार्यों (कई आदिम लोगों सहित) उनके व्यवहार को अनुकूलित करने के तरीके के रूप में मानकों का उपयोग करें। उदाहरण के लिए printf पोर्ट का उपयोग करके सामान प्रिंट करेगा जो current-output-port पैरामीटर का मान है। अब, मान लीजिए कि आप कुछ समारोह है कि प्रिंट है कि कुछ:

> (define (foo x) (printf "the value of x is ~s\n")) 

आप आम तौर पर इस समारोह फोन और कुछ स्क्रीन पर मुद्रित देखते हैं - लेकिन कुछ मामलों में आप इसे उपयोग करने के लिए फ़ाइल या जो कुछ भी करने के लिए कुछ प्रिंट करना चाहते हैं । आप ऐसा कर सकता है: इस के साथ

(define (bar) 
    (let ([old-stdout (current-output-port)]) 
    (current-output-port my-own-port) 
    (foo some-value) 
    (current-output-port old-stdout))) 

एक समस्या यह है कि यह करने के लिए कठिन है है - लेकिन है कि आसानी से किसी मैक्रो के साथ हल किया है। (वास्तव में, पीएलटी में अभी भी एक निर्माण है जो कुछ भाषाओं में करता है: fluid-let।) लेकिन यहां और अधिक समस्याएं हैं: क्या होता है यदि foo पर कॉल रनटाइम त्रुटि में परिणाम होता है? यह सिस्टम को खराब स्थिति में छोड़ सकता है, जहां सभी आउटपुट आपके पोर्ट पर जाते हैं (और आपको कोई समस्या भी दिखाई नहीं देगी, क्योंकि यह कुछ भी प्रिंट नहीं करेगा)। उस के लिए एक समाधान (जो fluid-let भी उपयोग करता है) dynamic-wind के साथ पैरामीटर की बचत/बहाली की रक्षा करना है, जो सुनिश्चित करता है कि यदि कोई त्रुटि है (और अधिक, यदि आप निरंतरता के बारे में जानते हैं) तो मान अभी भी बहाल हो गया है।

तो सवाल यह है कि ग्लोबल्स और fluid-let का उपयोग करने के बजाय पैरामीटर रखने का क्या मतलब है? दो और समस्याएं हैं जिन्हें आप केवल ग्लोबल्स के साथ हल नहीं कर सकते हैं। एक ऐसा होता है जब आपके पास एकाधिक धागे होते हैं - इस मामले में, अस्थायी रूप से मान सेट करने से अन्य थ्रेड प्रभावित होंगे, जो अभी भी मानक आउटपुट पर प्रिंट करना चाहते हैं। पैरामीटर्स एक विशिष्ट मूल्य प्रति थ्रेड होने के द्वारा हल करते हैं। क्या होता है कि प्रत्येक धागा उस धागे से "विरासत" मानता है जो इसे बनाता है, और एक थ्रेड में परिवर्तन केवल उस धागे में दिखाई देता है।

दूसरी समस्या अधिक सूक्ष्म है।आप एक अंकीय मान के साथ एक पैरामीटर है कि कहते हैं, और आपको निम्न क्या करना चाहते हैं:

(define (foo) 
    (parameterize ([p ...whatever...]) 
    (foo))) 

योजना में, "पूंछ कॉल" महत्वपूर्ण हैं - वे छोरों और भी बहुत कुछ बनाने के लिए बुनियादी उपकरण है। parameterize कुछ जादू करता है जो इसे अस्थायी रूप से पैरामीटर मान बदलने की अनुमति देता है लेकिन फिर भी इन पूंछ कॉलों को संरक्षित करता है। उदाहरण के लिए, उपर्युक्त मामले में, आप एक स्टैक ओवरफ़्लो त्रुटि प्राप्त करने के बजाय एक अनंत लूप प्राप्त करेंगे - क्या होता है कि इनमें से प्रत्येक parameterize अभिव्यक्तियों का पता लगा सकता है कि पहले parameterize है जो अब इसकी आवश्यकता नहीं है साफ - सफाई।

अंत में, parameterize वास्तव में पीएलटी के दो महत्वपूर्ण भागों का उपयोग करने के लिए इसका उपयोग करता है: यह प्रति थ्रेड मानों को लागू करने के लिए थ्रेड कोशिकाओं का उपयोग करता है, और यह पूंछ-कॉल को संरक्षित करने में सक्षम होने के लिए निरंतरता चिह्नों का उपयोग करता है। इनमें से प्रत्येक विशेषता अपने आप में उपयोगी है।

+0

भयानक उत्तर - धन्यवाद! – Claudiu

3

parameterize ब्लॉक के अवधि के लिए विशिष्ट मानों को निर्दिष्ट मानकों को सेट करता है, इसके बाहर उनके मूल्यों को प्रभावित किए बिना।

+0

हम्म दिलचस्प – Claudiu

3

पैरामीटरेट एक ऐसा माध्यम है जिसके द्वारा आप लैम्ब्डा को ऐसा करने के बिना, किसी मौजूदा फ़ंक्शन के भीतर गतिशील रूप से मूल्यों को फिर से बांध सकते हैं। प्रैक्टिस में कभी-कभी तर्कों को पारित करने और लैम्बडा का उपयोग करके बाध्य करने के बजाए फ़ंक्शन के भीतर मानों को फिर से बांधने के लिए पैरामीटर को उपयोग करना बहुत आसान होता है।

उदाहरण के लिए, कहें कि आपके द्वारा उपयोग की जाने वाली लाइब्रेरी HTML को stdout पर छोड़ देती है लेकिन सुविधा के लिए आप उस मान को एक स्ट्रिंग पर कैप्चर करना चाहते हैं और उस पर और संचालन करना चाहते हैं। लाइब्रेरी डिज़ाइनर के पास आपके लिए यह आसान बनाने के लिए कम से कम दो विकल्प हैं: 1) आउटपुट पोर्ट को फ़ंक्शन के लिए तर्क के रूप में स्वीकार करें या 2) वर्तमान-आउटपुट-पोर्ट मान पैरामीटर करें। 1 बदसूरत और परेशानी है। 2 nicer है क्योंकि सबसे संभावित व्यवहार stdout पर प्रिंट करना है, लेकिन यदि आप स्ट्रिंग-पोर्ट पर प्रिंट करना चाहते हैं तो आप उस फ़ंक्शन पर कॉल को पैरामीटर कर सकते हैं।