2009-07-23 16 views
7

मेरे पास शो नामक एक फ़ंक्शन है जो संदेश के साथ एक संवाद दिखाता है। मुझे इस कार्य को गलती में सभी वस्तुओं पर मैप करने की आवश्यकता है। लेकिन क्लोजर मुझे कोई संदेश नहीं दिखाता है। मैं क्या गलत कर रहा हूं?क्लोजर इस फ़ंक्शन को निष्पादित क्यों नहीं करता है?

(defn show[message] 
(. javax.swing.JOptionPane (showMessageDialog nil message))) 

(defn action[] 
    (map show '(HELLO Sweet love))) 

उत्तर

5

नक्शा फ़ंक्शन वास्तव में संग्रह के प्रत्येक ज्ञापन पर मैप किए गए फ़ंक्शन को नहीं चलाता है। बल्कि यह एक 'आलसी-विपक्ष' सेल देता है। यह आपके क्लासिक सिंगल लिंक्ड लिस्ट की तरह एक बहुत ही महत्वपूर्ण अंतर के साथ दिखता है, प्रत्येक सेल में डेटा की गणना की जाती है जब इसे परिभाषित करने के समय नहीं पढ़ा जाता है (यह परिणाम निश्चित रूप से बाद में पढ़ने के लिए संग्रहीत होता है)। इसलिए फ़ंक्शन वास्तव में चलाने के लिए आपको फ़ंक्शन चलाने के परिणाम को पढ़ना होगा। क्योंकि इस मामले में आप समारोह केवल कि यह भाग गया clojure कहा जाता है के लिए एक महान आवरण समारोह प्रदान करता है के परिणाम के बारे देखभाल न

(dorun .... insert your map here ....) 

कि मानचित्र का निर्माण करेगा, परिणाम पढ़ सकते हैं और तुरंत उन्हें बाहर भंडारण स्मृति बर्बाद कर के साथ बाहर फेंक बाद में उन्हें।

यदि आप ऐसे परिणामों के साथ फ़ंक्शन मैप करते हैं जहां आप रखना चाहते हैं तो इसके बजाय doseq का उपयोग करें।

+0

विस्तृत उत्तर के लिए धन्यवाद। क्या सभी सूची abstractions आलसी हैं? मुझे कैसे पता चलेगा कि कौन से हैं और कौन से नहीं हैं? – unj2

+0

मेरा मानना ​​है कि वे सभी रिवर्स को छोड़कर हैं, हालांकि वैक्टरों में एक (आरसीईसी [1 2 3]) फ़ंक्शन है जो अंत में शुरू होने वाला एक सेक बनाता है जो आम तौर पर उस समस्या को हल करता है। –

7

map आलसी है। जब तक आप इसे मूल्यांकन करने के लिए मजबूर नहीं करते हैं तब तक कुछ भी मूल्यांकन नहीं किया जा रहा है। या का उपयोग map के बजाय करें।

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