2010-05-14 13 views
5

R5RS वाक्य रचना के पुस्तकालय रूपों के लिए मैक्रो परिभाषाओं प्रस्तावित देता है:योजना में लेट्रेक की इस परिभाषा के साथ क्या, यदि कोई है, तो गलत है?

http://schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-10.html#%_sec_7.3

कौन सा भी letrec को परिभाषित करता है, एक बहुत ही जटिल तरीके से, निश्चित रूप से नहीं मैं इसे कैसे परिभाषित करेंगे, मैं बस का प्रयोग करेंगे:

(define-syntax letrec2 
    (syntax-rules() 
    ((letrec2 ((name val) ...) body bodies ...) 
    ((lambda() 
     (define name val) ... 
     body bodies ...))))) 

जहां तक ​​मैं लेट्रेक के अर्थशास्त्र को समझता हूं, जिसे मैं अक्सर नामित चलो के रूप में उपयोग करता हूं। यह इस तरह से काम करता है, हालांकि मेरे पास दार्शनिकों के साथ बहस का मेरा उचित हिस्सा था, जो सोचते हैं कि वे केवल विशेष सापेक्षता या स्थापित ध्वन्यात्मक सिद्धांतों को अस्वीकार कर सकते हैं, मुझे पता है कि जब आपको लगता है कि आपके पास जटिल समस्या का एक सरल समाधान है, तो शायद गलत। वहां कुछ बिंदु होना चाहिए जहां यह मैक्रो लेट्रेक के अर्थशास्त्र को संतुष्ट नहीं करता है, अन्यथा शायद उन्होंने इसका इस्तेमाल किया होगा।

इस परिभाषा में, परिभाषाएं लेट्रेक के शरीर के लिए स्थानीय हैं, वे पारस्परिक रिकर्सन के लिए एक दूसरे को संदर्भित कर सकते हैं, मुझे पूरा यकीन नहीं है कि (यदि कोई है) गलत है।

उत्तर

0

ठीक है, मुझे अंत में कारण मिला, यह बेकार के रूप में सरल है, वहां मेरी परिभाषा के साथ कुछ भी गलत नहीं है, और वास्तव में यह आर 5 आरएस में से किसी एक से बेहतर त्रुटियों के कारण है। 'Letrec' के लिए

http://community.schemewiki.org/?scheme-faq-macros

देखो, तुम सब क्या गलत था की मेरे प्रश्न का उत्तर नहीं हो सकता था, कुछ भी नहीं किया गया था गलत जाहिरा तौर पर, R5RS सूचनात्मक खंड जाहिर तौर पर एक 'से जोड़ा जाता है' था। मुझे अब अपना जवाब स्वीकार करने के लिए मजबूर होना होगा ... मुझे लगता है कि ...

अब सवाल उठता है कि आर 5 आरएस लेखकों ने इस सरल समाधान का चयन क्यों नहीं किया और एक बहुत ही जटिल व्यक्ति के लिए चला गया जिसमें एक त्रुटि भी शामिल थी। ..

+0

मुझे उद्धृत करते हुए: "आंतरिक परिभाषा केवल कुछ कार्यान्वयन में एक आदिम रूप है।" Schemewiki उद्धरण: "फिर भी, कुछ योजना कार्यान्वयन हैं जो केवल एक आदिम शीर्ष-स्तर की परिभाषा प्रदान करते हैं और Letrecs के संदर्भ में आंतरिक परिभाषा लागू करते हैं ..." आपकी परिभाषा केवल कुछ कार्यान्वयन में काम करती है। मैंने आर 5 आरएस के परिचय को उद्धृत करने के लिए उद्धृत किया कि मुझे लगता है कि आर 5 आरएस लेखकों ने आपके कार्यान्वयन का चयन क्यों नहीं किया। यदि आर 5 आरएस के दर्शन के बारे में मेरा मुद्दा समझ में नहीं आता है, तो मैं इसके बारे में आपके सवालों के जवाब देने को तैयार हूं। – Davorak

+0

@Davorak खैर, तकनीकी रूप से परिभाषा सभी कार्यान्वयन में * काम * होगा। यह सिर्फ कुछ कार्यान्वयन में आंतरिक 'परिभाषित' का उपयोग 'लेट्रेक' के मूल कार्यान्वयन में किया जाएगा। – dubiousjim

5

ऐसा लगता है कि आपने मैक्रो से कंपाइलर को कार्यान्वित करने की ज़िम्मेदारी को धक्का दिया है, आर 5 आरएस डिजाइनर इससे बचने की कोशिश कर रहे हैं।

वास्तव में स्थानीय परिभाषा आर 5 आरएस में लेट्रेक के साथ लागू की जाती है। 6.2.2 Internal definitions देखें।

मुझे लगता है कि डिजाइनरों इरादों में अच्छी तरह से अभिव्यक्त किया जाता है introduction to the R5RS में: सुविधा के शीर्ष पर सुविधा ढेर से नहीं तैयार किया जाना चाहिए

प्रोग्रामिंग भाषाओं, लेकिन कमजोरियों और प्रतिबंध है कि अतिरिक्त कर को हटाने के द्वारा विशेषताएं आवश्यक दिखाई देते हैं। योजना यह दर्शाता है कि भाव के गठन, कि वे किस तरह से बना रहे हैं पर कोई प्रतिबंध नहीं के साथ के लिए नियमों का एक बहुत छोटा संख्या, बनाने के लिए एक व्यावहारिक और कुशल प्रोग्रामिंग भाषा कि समर्थन करने के लिए पर्याप्त लचीला है पर्याप्त प्रमुख प्रोग्रामिंग के सबसे आज उपयोग में प्रतिमान।

संपादित 1: आंतरिक परिभाषा का उदाहरण Letrec के r5rs संस्करण में परिवर्तित किया गया। PLT योजना 4.2.5 एकत्र/r5rs/main.ss

(define-syntax (r5rs:body stx) 
(syntax-case stx (let) 
    [(_ (let() . body)) 
    #'(let() . body)] 
    [_ 
    ;; Convert internal definitions to `r5rs:letrec', as opposed 
    ;; to `letrec'. 
... 

R5RS मोड में PLT योजना में letrec की R5RS संस्करण के लिए आंतरिक परिभाषित करता है परिवर्तित करता है। आप आंतरिक परिभाषा वाले किसी भी कोड पर डॉ। स्केम के मैक्रो विस्तारक का उपयोग कर अपने लिए यह भी जांच सकते हैं।

+0

खैर, परिभाषित एक प्राचीन रूप है, लाइब्रेक के विपरीत लाइब्रेरी फॉर्म नहीं है। परिभाषित करें और सेट करें! वास्तव में अन्य कार्यों के संदर्भ में परिभाषित नहीं किया जा सकता है। इसके अलावा, बाकी के लिए मुझे वास्तव में यह नहीं मिलता है कि आपकी पोस्ट यहां मेरे बिंदु से कैसे संबंधित है, मैंने अभी भी इसे एक मैक्रो रखा है। और Letrec R5RS मानक का हिस्सा है, हालांकि यह एक मैक्रो के रूप में इसे समझने के कार्यान्वयन के लिए संभव है, जब तक आर 5 आरएस में दिए गए अर्थशास्त्र को पूरा नहीं किया जाता है, तब तक इसकी आवश्यकता नहीं होती है। और यह अभी भी एक मैक्रो है, आर 5 आरएस में मैक्रोज़ 'सुझाव' हैं। – Zorf

+0

@ लाजला आंतरिक परिभाषा केवल कुछ कार्यान्वयन में एक आदिम रूप है। कुछ कार्यान्वयन में लेट्रेक के संदर्भ में आंतरिक परिभाषा परिभाषित और परिभाषित की जा सकती है। जब आपका आंतरिक परिभाषा प्राचीन होता है तो आपका मैक्रो केवल लेट्रेक को परिभाषित करने के लिए काम करता है। आंतरिक परिभाषा को अक्सर लेट्रेक के संदर्भ में परिभाषित किया जाता है क्योंकि यह उस दर्शन का पालन करता है जिसे मैंने आर 5 आरएस के परिचय से उद्धृत किया था। – Davorak

+0

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

0

अच्छा सवाल।

मुझे लगता है कि define के अनुक्रम के साथ समस्या यह है:

" भाव expr के मूल्यांकन के आदेश ...अनिर्दिष्ट है, तो एक कार्यक्रम चर letrec अभिव्यक्ति से बंधे में से किसी को एक संदर्भ से पहले सभी मान का मूल्यांकन नहीं होना चाहिए "अभिकलन किया गया है

यहाँ: http://www.scheme.com/tspl4/binding.html#./binding:s20

+0

लेकिन अगर मैं गलत नहीं हूं तो आंतरिक (और बाहरी) परिभाषाएं यही करती हैं। यही कारण है कि वे स्वतंत्र रूप से एक-दूसरे और पारस्परिक रूप से पुनर्विचार कर सकते हैं। मैंने स्थानीय मूलभूत, पारस्परिक रूप से पुनरावर्ती जैसे सभी बुनियादी परिचालनों की भी कोशिश की? और अजीब? फ़ंक्शन, लेट्रेक 2 के संदर्भ में नामित-चलो परिभाषित करते हैं, जिससे उन्हें अपने व्याख्यात्मक वातावरण पर बंद कर दिया जाता है जो सभी काम करते हैं। मैं बहुत खो गया हूँ। इसके अलावा, R5RS मानक को इस दृष्टिकोण की ओर परिभाषित किया गया है, जैसा कि, Letrec में परिभाषित फ़ंक्शंस परिभाषित कार्यों तक पहुंच सकते हैं, लेकिन अन्य मानों तक नहीं, जब तक कि स्पष्ट रूप से Letrec में परिभाषित नहीं किया जाता है। – Zorf

+0

मुझे विश्वास है कि आप गलत हैं। आर 5 आरएस में बाहरी और आंतरिक परिभाषा एक दूसरे से अलग हैं। बाहरी परिभाषाओं के लिए: (बी को परिभाषित करें) (बी 2 परिभाषित करें) पहली परिभाषा के लिए एक वाक्यविन्यास त्रुटि है क्योंकि बी अभी तक परिभाषित नहीं है। आंतरिक परिभाषा या letrec (letrec ((ab) (बी 2) ए) के लिए -> # और एक वाक्यविन्यास त्रुटि नहीं होनी चाहिए। (Lambda() (अब परिभाषित करें) (बी 2 परिभाषित करें) ए)) -> # Davorak

+0

हम्म, मैं और अधिक स्पष्ट होना चाहता था लेकिन मेरे पास बहुत छोटे अक्षर थे, हाँ, यह एक वाक्यविन्यास त्रुटि है, लेकिन: (परिभाषित करें (लैम्ब्डा (एक्स) (+ (बी 2) एक्स)) (बी परिभाषित करें (लैम्ब्डा (एक्स) (+ 1 एक्स))) जैसा कि मैंने कहा था, वे पहले परिभाषित मूल्यों तक नहीं पहुंच सकते हैं, लेकिन वे बाद में परिभाषित किए जा रहे कार्यों तक पहुंच सकते हैं। यह बाहरी और आंतरिक में समान है परिभाषित करता है और (2) इस उदाहरण में 5 के अपेक्षित परिणाम का मूल्यांकन करता है। यही कारण है कि मैंने इस बिंदु को उठाया कि लेट्रेक के अर्थशास्त्र को आंतरिक परिभाषाओं के अनुरूप बनाया गया है, क्योंकि लेट्रेक स्पष्ट रूप से कहता है कि यह केवल कार्यों को संदर्भित कर सकता है, न कि मूल्यों के लिए – Zorf

3

R5RS राज्यों कि letrec के शब्दों आंतरिक परिभाषा के उन लोगों के रूप बिल्कुल एक जैसे हैं जानकारी के लिए the section devoted to the latter देखें, मैं नीचे दिए गए महत्वपूर्ण टुकड़ा बोली:।

ए < शरीर > जिसमें आंतरिक परिभाषाएं शामिल हैं, हमेशा पूरी तरह समकक्ष letrec अभिव्यक्ति में परिवर्तित हो सकती हैं।

इस प्रकार आंतरिक परिभाषित करता है के मामले में letrec को परिभाषित सिर्फ चारों ओर समस्या बदलाव।

इसके अलावा, मैं यह आसान एक letrec मैक्रो को परिभाषित करने और letrec में lambda desugar आंतरिक परिभाषित करता है lambda हैंडलर में सब है कि जटिल कोड सामान और उसके ऊपर letrec निर्माण करने के लिए की तुलना में है करने के लिए लगता है। यह इस सवाल पर छूए बिना है कि एक गैर-शीर्ष-स्तरीय दायरे में पारस्परिक रूप से पुनरावर्ती बाइंडिंग शुरू करने का सुंदर रूप है ... ;-)

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