2009-11-18 15 views
11

रैंडम के अनंत आलसी seqs उत्पन्न करने के लिए लगभग 2 समान कार्यक्रम। पहला क्रैश नहीं होता है। OutOfMemoryError अपवाद के साथ दूसरा दुर्घटना। क्यूं कर?क्लोजर: आलसी जादू

;Return infinite lazy sequence of random numbers  
(defn inf-rand[] (lazy-seq (cons (rand) (inf-rand))))  

;Never returns. Burns the CPU but won't crash and lives forever.  
(last (inf-rand)) 

लेकिन दुर्घटना के बाद बहुत जल्दी:

;Return infinite lazy sequence of random numbers  
(defn inf-rand[] (lazy-seq (cons (rand) (inf-rand))))  
(def r1 (inf-rand)) 

;Crash with "OutOfMemoryError" 
(last r1) 

उत्तर

23

मेरा मानना ​​है कि यह "सिर पकड़े" का एक उदाहरण है।

आप बाद में (first r1) की तरह कुछ कह रही है की संभावना को खोलने के दूसरे उदाहरण में संदर्भ r1 करके तो आप अपने आलसी-सेक के सदस्यों के भंडारण के अंत के रूप में वे reified कर रहे हैं।

पहले मामले में क्लोजर यह निर्धारित कर सकता है कि अनंत अनुक्रम के पहले सदस्यों के साथ कभी भी कुछ भी नहीं किया जाएगा ताकि उन्हें डिस्प्ले किया जा सके और स्मृति का उपभोग नहीं किया जा सके।

मैं अभी भी क्लोजर शुरुआत करने वाला बहुत अधिक हूं, मेरी समझ या शब्दावली के लिए कोई टिप्पणी या सुधार बहुत सराहना करता है।

+0

मैं भी एक नौसिखिया हूं, लेकिन आपकी व्याख्या बहुत सही दिखती है। अगर आपने मुझे मार नहीं दिया होता तो मैंने वही बात का जवाब दिया होगा! और 6 अपवित्र आपके साथ सहमत हैं। –

+0

जब मैंने कुछ समय पहले क्लोजर में प्रोजेक्ट यूलर की समस्याएं शुरू कर दीं, तो अनंत आलसी दृश्यों पर मेरे डीबग प्रिंटों ने मेरे कार्यक्रमों को धीमा कर दिया ... असीम रूप से। असीमित आलसी अनुक्रम एक महत्वपूर्ण क्लोजर अवधारणा है जो पकड़ने के लिए आती है। –

+2

बीटीडब्लू, कैसे कोई स्टैक ओवरफ्लो नहीं है। इंफ-रैंड – GabiMe

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