हाँ, वास्तव में आप कुछ कोड लेने के लिए और और हर एक पूंछ कॉल में लौट — हर कार्य कॉल — बदल सकते हैं। आप जो खत्म करते हैं उसे निरंतरता-गुजरने वाली शैली या सीपीएस कहा जाता है।
उदाहरण के लिए, यहाँ दो पुनरावर्ती कॉल युक्त एक समारोह है:
(define (count-tree t)
(if (pair? t)
(+ (count-tree (car t)) (count-tree (cdr t)))
1))
और यहाँ अगर आप निरंतरता-गुजर शैली को यह समारोह परिवर्तित यह कैसी दिखाई देगी:
(define (count-tree-cps t ctn)
(if (pair? t)
(count-tree-cps (car t)
(lambda (L) (count-tree-cps (cdr t)
(lambda (R) (ctn (+ L R))))))
(ctn 1)))
अतिरिक्त तर्क, ctn
, एक प्रक्रिया है जो पूंछ-कॉल लौटने की बजाय है। (एसडीसीवीवीसी का जवाब कहता है कि आप ओ (1) स्पेस में सबकुछ नहीं कर सकते हैं, और यह सही है; यहां प्रत्येक निरंतरता एक बंद है जो कुछ मेमोरी लेती है।)
मैंने कॉल को car
पर परिवर्तित नहीं किया है या पूंछ-कॉल में cdr
या +
।यह भी किया जा सकता है, लेकिन मुझे लगता है कि उन पत्ते की कॉल वास्तव में रेखांकित की जाएगी।
अब मजेदार भाग के लिए। Chicken Scheme वास्तव में यह संकलन करता है जो सभी संकलन करता है। चिकन द्वारा संकलित प्रक्रियाएं कभी भी वापस नहीं आतीं। एक क्लासिक पेपर समझाता है कि चिकन योजना 1 99 4 में चिकन लागू होने से पहले क्यों लिखी गई थी: CONS should not cons its arguments, Part II: Cheney on the M.T.A.
आश्चर्यजनक रूप से पर्याप्त, निरंतरता-गुजरने वाली शैली जावास्क्रिप्ट में काफी आम है। आप ब्राउज़र की "धीमी स्क्रिप्ट" पॉपअप से परहेज करते हुए to do long-running computation का उपयोग कर सकते हैं। और यह एसिंक्रोनस एपीआई के लिए आकर्षक है। jQuery.get
(XMLHttpRequest के आसपास एक साधारण रैपर) निरंतरता-गुजरने वाली शैली में स्पष्ट रूप से है; अंतिम तर्क एक समारोह है।
स्रोत
2009-12-11 16:07:11
मैं असहमत हूं कि पूंछ रिकर्सन प्रदर्शन प्रदर्शन अनुकूलन है। इसे शुद्धता के साथ करना है: इसके बिना किसी भाषा में प्रोग्रामिंग, आपको रिकर्सन के साथ असंबद्ध पुनरावृत्ति को संभालने से रोकती है, जबकि इस सुविधा के साथ भाषाओं में, आप निरंतर पुनरावृत्ति के लिए रिकर्सन (कुछ बाधाओं के साथ) का उपयोग करने के लिए स्वतंत्र हैं। यह एक महत्वपूर्ण बात है: पूंछ-पुनरावृत्ति की (गारंटीकृत) उपस्थिति भाषा के अर्थशास्त्र को बदल देती है। – harms
यह अर्थशास्त्र कैसे बदलता है? किसी भी मामले में एक ही सार गणना का वर्णन किया जा रहा है। परिणामस्वरूप कोड का समय और स्थान जटिलता तर्कसंगत रूप से कार्यान्वयन विवरण है, हालांकि यदि आप वास्तव में प्रोग्राम चलाने की अपेक्षा करते हैं तो एक महत्वपूर्ण व्यक्ति के बावजूद। –
मुझे शायद यह समझना चाहिए कि यदि आपके पास * स्थिर * स्टैक है, तो यह अर्थशास्त्र को बदलता है, जिसे मैं समझता हूं सामान्य मामला है, उदा। जावा के साथ आप जेवीएम के लिए स्टार्टअप पर एक पैरामीटर पास कर सकते हैं कि स्टैक कितना बड़ा होना चाहिए, लेकिन स्टैक विकसित नहीं हो सकता है और मशीन की मेमोरी का उपयोग होने तक बढ़ता जा सकता है। आप अमूर्त गणना के बारे में बोलते हैं, और आप एक अर्थ में सही हैं, लेकिन यह "लीकी अबास्ट्रक्शन" का एक उत्कृष्ट उदाहरण है: अंतर्निहित कार्यान्वयन खुद को प्रस्तुत करता है, और पूंछ-कॉल के लिए गारंटी के बिना, प्रोग्रामर उन पर भरोसा नहीं कर सकता है। – harms