2012-07-05 15 views
5

निम्नलिखित कोड पर विचार करें:निरंतरता में उपयोगी धर्मार्थ क्यों नहीं है?

(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-arityprocedure-arity के लिए प्रतिस्थापित करना) दिखाता है कि निरंतरता भी किसी भी तर्क की अनुमति देती है, भले ही यह स्पष्ट रूप से मामला न हो।

तो, वह क्यों है? जहां तक ​​मैं समझता हूं (अगर मेरी समझ गलत है तो मुझे सही करें), निरंतरता की धैर्य बहुत सरल है: call-with-values के संदर्भ में यह 1 है, इस मामले में दाएं हाथ की तरफ लैम्बडा की जो भी चीज है, वह है। (जो, दी, अगर यह जटिल हो सकता है एक case-lambda या की तरह है, लेकिन कोई और अधिक जटिल की तुलना में अगर आप (procedure-arity (case-lambda ...)) सीधे बुला रहे थे।)

+0

IMO, यह तर्क के किसी भी संख्या, के रूप में जब स्पष्ट निरंतरता कॉल/सीसी के साथ बनाया जाता है, संदर्भ अज्ञात है जब तक निरंतरता वास्तव में कहा जाता है होना चाहिए। मुझे लगता है कि spec (R5/6) में 'मानों' की परिभाषा इसे अच्छी तरह से बताती है। – leppie

+0

मुझे पूरा यकीन नहीं है कि 'मूल्यों' का तात्पर्य है कि निरंतरता में मनमानी धैर्य है। निरंतरता के समर्थन से आपको मूल्यों की एक अलग संख्या वापस करने की अनुमति नहीं है। :-) इस प्रकार, '(+ (मान 1 2 3) 42)' मान्य नहीं है: इस संदर्भ में (आर 5 आरएस में परिभाषित 'मूल्य' मानते हुए), बनाए गए निरंतरता में arity 1 है, और कुछ नहीं। –

+1

'कॉल-टू-वैल्यू' के साथ, * उपभोक्ता * धर्मार्थ निर्धारित करता है, न कि * निर्माता *। बेशक – leppie

उत्तर

2

ही देखने के लिए एक आसान तरीका है:

(call-with-values 
    (lambda() (error 'arity "~v" (procedure-arity (call/cc (λ (k) k))))) 
    (lambda (x y) (procedure-arity y))) 

और और भी आसान:

(procedure-arity (call/cc (λ (x) x))) 

और अपने प्रश्न के लिए - यह पहला मामला है कि निरंतरता दो आदानों की उम्मीद में स्पष्ट है, लेकिन वह जैसे मामलों में भी आम नहीं हैं। उदाहरण के लिए, वे आमतौर पर ऐसे उदाहरण होते हैं, जबकि "असली कोड" define-values का उपयोग करेगा या कुछ अज्ञात निरंतरता होगी, जहां call/cc बनाता है जो निरंतरताएं उनके द्वारा बनाए गए संदर्भ के आधार पर अलग-अलग arities हो सकती हैं। इसका मतलब यह है कि इन दुर्लभ मामलों को जानने की कोशिश करने में बहुत कुछ नहीं है जहां निरंतरता की शांति ज्ञात है।

पाद-टिप्पणी:

;; nonsensical, but shows the point 
(define (foo) (call/cc (λ (x) x))) 
(define x (foo)) 
(define-values [y z] (foo)) 
+0

रुको, क्या आप कह रहे हैं कि ऐसे समय हैं जहां निरंतरता की धैर्य अपने कब्जे के बिंदु पर _unknown_ है? शायद मैं इसके बारे में काफी मुश्किल नहीं सोच रहा हूं। –

+0

हाँ, फुटनोट देखें। जब तक आप इन निरंतरताओं में से प्रत्येक को गतिशील रूप से विभिन्न धर्मार्थियों को प्राप्त नहीं करना चाहते हैं ... (लेकिन मुझे दौड़ना है, इसलिए अब इस पर अधिक समय नहीं लगाया जा सकता है।) –

+0

गतिशील दृष्टिकोण वास्तव में मेरे मन में था जब मैंने सवाल पूछा , लेकिन शायद यह व्यवहार्य नहीं है। मुझे यह देखने के लिए एक सबूत-अवधारणा बनाने की कोशिश करनी चाहिए कि यह काम भी करेगा या नहीं। इस बीच, एक बड़ा हरा टिक है। मेरा मतलब है, आप इसके लिए 2 महीने इंतजार कर चुके हैं। :-) –

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