2011-12-16 12 views
11

मैं क्लोजर के लिए नया हूं और पाया है कि जब मैं एक सूची समझ का उपयोग करके क्लोजर में इस वेक्टर पर लूप करता हूं तो मुझे अंत में कुछ nil एस मिलते हैं।वैक्टरों पर लूपिंग

(def myVec [1,2,3]) 

user=> (for [x myVec] (println x)) 
(1 
2 
3 
nil nil nil) 

मैं एक ही बात map

user=> (map println myVec) 
(1 
2 
3 
nil nil nil) 

क्या nill इन मामलों में मुद्रित करने के लिए कारण बनता है का उपयोग कर मिल सकता है?

+2

(doseq [x myVec] (println x) का उपयोग करके) – BLUEPIXY

उत्तर

6

उन nilprintln का वापसी मूल्य है। हर बार जब आप

(println "something") 
मानक आउटपुट पर

println समारोह प्रिंट something फोन, और फिर nil देता है। आपके कोड में समग्र प्रभाव यह है कि आप सभी println आमंत्रणों के सभी दुष्प्रभाव (I/O) देखते हैं, फिर आरईपीएल प्रत्येक आमंत्रण (जैसे तीन बार nil) से आने वाले वापसी मूल्य को प्रिंट करता है।

9

for और map (println element) का परिणाम द्वारा प्रतिस्थापित मूल सदिश में हर तत्व के साथ एक नया आलसी अनुक्रम बनाते हैं, और println रिटर्न शून्य।

तत्वों पर साइड इफेक्ट्स (प्रिंटिंग) करने के लिए आपको for और map का उपयोग नहीं करना चाहिए। इसके लिए doseq का उपयोग करें।

+0

कुछ भ्रम उस क्रम से आता है जिसमें डेटा मुद्रित होता है। प्रारंभिक कोष्ठक सूची के हिस्से के रूप में मुद्रित हो जाता है (नक्शा (println ...)) देता है, तो आप प्रत्येक println का आउटपुट प्राप्त करते हैं, फिर उन नील जो सूची (भाग (println ...) की सूची का हिस्सा हैं) । यदि आप डोसक का उपयोग करने के लिए स्विच करते हैं, या यदि आप (डोल (मानचित्र (println ...))), परिणाम थोड़ा कम संदिग्ध होंगे क्योंकि आप रिटर्न मान प्राप्त करने से पहले सभी प्रिंट्स देखेंगे। (dorun (मानचित्र (println ...))) बस वापस आ जाएगा। जब तक मैं डोरुन नहीं मिला और डोल उलट गया। –

+4

@ SavanniD'Gerinel जो चीजें आप कह रहे हैं वे बेहद सच हैं, लेकिन अधिकांश विवरणों में गलत हैं। चीजें "गलत" क्रम में आती हैं क्योंकि अनुक्रम खराब हो जाता है, न कि प्रतिकृति मूल्यों से पहले साइड इफेक्ट्स प्रिंट करता है: यदि आपके पास एक अनचाहे अनुक्रम था जैसे '(10 ले लें (iterate # (inc (doto% println) 0)) ', आप प्रिंट परिणामों के साथ interleaved वापसी मूल्य देखेंगे। इसी प्रकार यदि आपके पास एक सिंगल चंक (आकार 50 का कहना है) से बड़ा सूची है, तो आपको प्रिंट का एक गुच्छा मिलेगा, फिर मूल्यों का एक समूह, फिर अधिक प्रिंट ... – amalloy

+0

यह जानकारीपूर्ण है। जो मैं कह रहा था उसका सारांश यह था कि आप वास्तव में उस आदेश को भविष्यवाणी नहीं कर सकते थे जिसमें चीजें मुद्रित की गईं थीं, लेकिन यहां तक ​​कि यहां दिए गए खंडन को भी गलत बताया गया होगा। जैसा कि यह खड़ा है, मैं केवल कुछ दिन पहले चकित होने के बारे में जागरूक हो गया था। –

1

nil प्रिंटल द्वारा लौटाया गया मान है ताकि आप मुद्रित लाइनों को नील मानों की मैप की गई सूची के बाद देख रहे हों।