2016-06-26 3 views
5

मैं क्लोजर में बहुत नया हूं। मैं सूची के प्रत्येक आइटम को न्यूलाइन में प्रिंट करना चाहता हूं। मैं इस तरह कोशिश कर रहा हूँ:सूची के प्रत्येक आइटम को अलग लाइन क्लोजर में कैसे मुद्रित करें?

user=> (def my-list '(1 2 3 4 5)) 
;; #'user/my-list 
user=> my-list 
;; (1 2 3 4 5) 
user=> (apply println my-list) 
;; 1 2 3 4 5 
;; nil 

लेकिन मैं चाहता हूँ मेरी उत्पादन होना चाहिए:

1 
2 
3 
4 
5 
nil 

किसी को भी मुझे बता सकते हैं, मैं यह कैसे कर सकते हैं? धन्यवाद।

उत्तर

6

इस प्रकार का उपयोग केस (अनुक्रम के प्रत्येक सदस्य के लिए एक बार दुष्प्रभाव निष्पादित करें) doseq का उद्देश्य है। इसे यहाँ का उपयोग करते हुए की तरह

(doseq [item my-list] 
    (println item)) 

ध्यान दें कि यह नहीं प्रिंटnil लेकिन यह वापस आ जाएगी जाएगा होगा। आरईपीएल में इसके साथ काम करने से मुद्रित सभी अभिव्यक्तियों के वापसी मूल्य दिखाई देंगे, लेकिन ऐसा नहीं होता है। टर्मिनल प्रोग्राम के रूप में अपनी परियोजना शुरू करना।

+0

ठीक है। मुझे मेरा जवाब मिला। धन्यवाद। @ मैगोस –

14

आप पहले से ही एक समारोह है कि आप एक ही क्रम में हर आइटम के लिए लागू करना चाहते हैं, तो आप अधिक से अधिक काट कूट के लिए run! बजाय doseq उपयोग कर सकते हैं:

(run! println [1 2 3 4 5]) 
;; 1 
;; 2 
;; 3 
;; 4 
;; 5 
;;=> nil 

doseq उपयोगी होता है जब कार्रवाई आप चाहते हैं प्रदर्शन करने के लिए केवल एक अनुक्रम में वस्तुओं को एक ही फ़ंक्शन लागू करने से अधिक जटिल है, लेकिन यहां run! ठीक काम करता है।

+0

ओह शांत! यह बेहतर दृष्टिकोण लगता है। धन्यवाद। @ सैम –

1

एक और रणनीति उस सूची से एक स्ट्रिंग बनाना होगा जिसे आप मुद्रित करना चाहते हैं और फिर स्ट्रिंग प्रिंट करें।

user> (defn unlines [coll] 
     (clojure.string/join \newline coll)) 
#'user/unlines 

user> (unlines [1 2 3 4 5]) 
"1\n2\n3\n4\n5" 

user> (println (unlines [1 2 3 4 5])) 
1 
2 
3 
4 
5 
nil 
+0

मुख्य अंतर यह है कि जब आप जिस अनुक्रम को प्रिंट कर रहे हैं वह आलसी है; तुलना करें '(रन! println (रेंज)) 'और' (println (अनलाइन (रेंज))) '। –

+0

@ सैमस्टेप आप सही हैं, यह एक अनंत सूची पर काफी उपयोगी नहीं है। स्ट्रिंग बनाने से पहले आलसी दृश्यों को महसूस करना होगा। लेकिन सामान्य रूप से, सीमाओं को साइड-इफेक्टिंग कोड सीमित करना एक खराब रणनीति नहीं है। एक स्ट्रिंग जो स्ट्रिंग देता है वह कंसोल पर प्रिंट करने वाले एक से अधिक परीक्षण योग्य होता है। –

+0

सहमत हुए। यह सिर्फ एक सवाल है कि विशेष रूप से क्या कार्य करने की आवश्यकता है। प्रिंटिंग के इस विशेष मामले में पांच पहले से ज्ञात वस्तुओं को न्यूलाइन द्वारा अलग किया गया है, मैं कहूंगा कि आपका 'अनलाइन' समाधान बेहतर है। लेकिन क्रियाओं को निष्पादित करने के अधिक सामान्य मामले में (जिसमें इनपुट या आउटपुट या दोनों शामिल हो सकते हैं), परिणाम को सटीक बनाना हमेशा एक विकल्प नहीं होता है। –

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

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