निम्नलिखित कोड पर विचार करें:निरंतरता में उपयोगी धर्मार्थ क्यों नहीं है?
(call-with-values
(lambda()
(call/cc (lambda (k)
(k k k))))
(lambda (x y)
(procedure-arity y)))
यह बहुत स्पष्ट है कि यहाँ call/cc
कॉल के बिंदु पर निरंतरता दाएँ हाथ की ओर पर लैम्ब्डा वापसी मान है, इसलिए इसकी arity 2. हालांकि होना चाहिए, है उपर्युक्त (रैकेट में) (arity-at-least 0)
इसके बजाए है।
दरअसल, गुइल में समान कोड चलाना (procedure-minimum-arity
procedure-arity
के लिए प्रतिस्थापित करना) दिखाता है कि निरंतरता भी किसी भी तर्क की अनुमति देती है, भले ही यह स्पष्ट रूप से मामला न हो।
तो, वह क्यों है? जहां तक मैं समझता हूं (अगर मेरी समझ गलत है तो मुझे सही करें), निरंतरता की धैर्य बहुत सरल है: call-with-values
के संदर्भ में यह 1 है, इस मामले में दाएं हाथ की तरफ लैम्बडा की जो भी चीज है, वह है। (जो, दी, अगर यह जटिल हो सकता है एक case-lambda
या की तरह है, लेकिन कोई और अधिक जटिल की तुलना में अगर आप (procedure-arity (case-lambda ...))
सीधे बुला रहे थे।)
IMO, यह तर्क के किसी भी संख्या, के रूप में जब स्पष्ट निरंतरता कॉल/सीसी के साथ बनाया जाता है, संदर्भ अज्ञात है जब तक निरंतरता वास्तव में कहा जाता है होना चाहिए। मुझे लगता है कि spec (R5/6) में 'मानों' की परिभाषा इसे अच्छी तरह से बताती है। – leppie
मुझे पूरा यकीन नहीं है कि 'मूल्यों' का तात्पर्य है कि निरंतरता में मनमानी धैर्य है। निरंतरता के समर्थन से आपको मूल्यों की एक अलग संख्या वापस करने की अनुमति नहीं है। :-) इस प्रकार, '(+ (मान 1 2 3) 42)' मान्य नहीं है: इस संदर्भ में (आर 5 आरएस में परिभाषित 'मूल्य' मानते हुए), बनाए गए निरंतरता में arity 1 है, और कुछ नहीं। –
'कॉल-टू-वैल्यू' के साथ, * उपभोक्ता * धर्मार्थ निर्धारित करता है, न कि * निर्माता *। बेशक – leppie