डोजाक और क्लोजर में अंतर


105

डोज़ाक और क्लोज़र में क्या अंतर है? जब आप एक-दूसरे का उपयोग करना पसंद करेंगे तो कुछ उदाहरण क्या हैं?

जवाबों:


167

अंतर यह है कि forएक आलसी अनुक्रम बनाता है और इसे देता है जबकि doseqसाइड-इफेक्ट्स और रिटर्न एनआईएल निष्पादित करने के लिए होता है।

user=> (for [x [1 2 3]] (+ x 5))
(6 7 8)
user=> (doseq [x [1 2 3]] (+ x 5))
nil
user=> (doseq [x [1 2 3]] (println x))
1
2
3
nil

यदि आप अन्य अनुक्रमों के आधार पर एक नया अनुक्रम बनाना चाहते हैं, तो उपयोग करें। यदि आप कुछ अनुक्रमों के तत्वों के आधार पर साइड-इफेक्ट्स (प्रिंटिंग, डेटाबेस लिखना, न्यूक्लियर वॉरहेड आदि लॉन्च करना) करना चाहते हैं, तो डोज़क का उपयोग करें।


11
अब इसके बहुत दुष्परिणाम हैं ... परमाणु युद्ध शुरू करना :)
मार्क

6
धन्यवाद! मैंने अपने (लंबे समय से) बालों को "के लिए" के साथ खींच लिया था कि यह कभी भी मेरे आइटम की सूची में मेरे परमाणु वारहेड को आग नहीं देता। "डोसेक" निश्चित रूप से किया था।
यू शेन

यह भेद डालने का एक शानदार तरीका है।
18 अक्टूबर को jskulski

60

ध्यान दें कि आलसी होते doseqहुए भी उत्सुक forहै। रेने के जवाब में मिसाल है

(for [x [1 2 3]] (println x))

REPL में, यह आम तौर पर वही करेगा जो आप चाहते हैं, लेकिन यह मूल रूप से एक संयोग है: REPL द्वारा उत्पादित आलसी अनुक्रम को बल देता है for, जिससे प्रिंटलैन्स उत्पन्न होते हैं। एक गैर-संवादात्मक वातावरण में, कुछ भी कभी भी मुद्रित नहीं किया जाएगा। के परिणामों की तुलना करके आप इसे कार्रवाई में देख सकते हैं

user> (def lazy (for [x [1 2 3]] (println 'lazy x)))
#'user/lazy

user> (def eager (doseq [x [1 2 3]] (println 'eager x)))
eager 1
eager 2
eager 3
#'user/eager

क्योंकि defप्रपत्र बनाए गए नए संस्करण को लौटाता है, न कि वह मान जो इसके लिए बाध्य है, आरईपीएल को प्रिंट करने के लिए कुछ भी नहीं है, और lazyएक अवास्तविक आलसी-सेक् का उल्लेख करेगा: इसके तत्वों में से कोई भी गणना नहीं की गई है। eagerको संदर्भित करेगा nil, और इसके सभी मुद्रण हो चुके होंगे।


डोज़ैक अनंत आलसी अनुक्रम का मूल्यांकन कैसे करता है? बुरा विचार? केवल इसे उत्सुक दृश्यों पर कहें, या तो उत्सुक या आलसी?
जोंकबेकर्स

@johnbakers जब तक मूल्यांकन बाधित नहीं होता है तब तक यह हमेशा के लिए अवरुद्ध हो जाएगा। क्लीजुर अनंत दृश्यों की तुलना में कभी भी अनंत दृश्यों को संभालने का प्रयास नहीं करता है।
रेडॉन रोसबोरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.