2010-05-31 14 views
17

मैं कुछ उदाहरण फाइबोनैचि अनुक्रम clojure कोड के माध्यम से देख रहा हूँ:क्लोजर में आलसी-सीक का क्या मतलब है?

(def fibs (lazy-cat [1 2] (map + fibs (rest fibs)))) 

मैं आम तौर पर समझ में क्या चल रहा है, लेकिन lazy-cat की बात नहीं मिलता है। मुझे पता है कि lazy-cat एक मैक्रो जो कुछ इस तरह में अनुवाद किया जाता है:

(def fibs (concat (lazy-seq [1 2]) (lazy-seq (map + fibs (rest fibs))))) 

वास्तव में क्या lazy-seq पूरा करने है? यह अभी भी lazy-seq के बिना भी आलसी मूल्यांकन किया जाएगा? क्या यह कड़ाई से कैशिंग उद्देश्यों के लिए है?

संपादित करें: उत्तर के लिए धन्यवाद। मेरा भ्रम यह था कि यह आरईपीएल से एक सादे concat के साथ काम करता था क्योंकि मेरे पास पिछले क्षेत्र में फाइबर के लिए बाध्यकारी था।

उत्तर

16

lazy-seq[1 2] पर आवश्यक नहीं है, लेकिन वास्तव में चोट नहीं पहुंचाता है।

lazy-seq(map + fibs (rest fibs)) पर आवश्यक है; इसके बिना, fibs से पहले फ़ंक्शन कॉल का मूल्यांकन किया जाएगा, जो एक मान से जुड़ा हुआ है, जो अपवाद का कारण बनता है। इसे lazy-seq में लपेटकर, कॉल की आवश्यकता होने तक कॉल स्थगित कर दिया जाएगा, और fibs उस बिंदु पर एक मूल्य होगा।

7

मैं इसे समझ (और मैं अभी भी Clojure के लिए अपेक्षाकृत नवागंतुक होने के स्वीकार करते हैं!), यदि आप निम्नलिखित की कोशिश के रूप में:

(def fibs (concat [1 2] (map + fibs (rest fibs)))) 

फिर क्योंकि fibs अभी तक बाध्य नहीं है यह काम नहीं करेगा और इसलिए इसके बाद के दो संदर्भ विफल हो गए।

आपके द्वारा दिए गए आलसी संस्करण हालांकि काम करेंगे, क्योंकि फाइबर के संदर्भ केवल बाद में हल किए जाते हैं जब अनुक्रम का उपभोग होता है - और किस बिंदु से फाइब को आलसी अनुक्रम के रूप में सफलतापूर्वक परिभाषित किया जा चुका है।

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