डोज़ाक और क्लोज़र में क्या अंतर है? जब आप एक-दूसरे का उपयोग करना पसंद करेंगे तो कुछ उदाहरण क्या हैं?
डोज़ाक और क्लोज़र में क्या अंतर है? जब आप एक-दूसरे का उपयोग करना पसंद करेंगे तो कुछ उदाहरण क्या हैं?
जवाबों:
अंतर यह है कि 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
यदि आप अन्य अनुक्रमों के आधार पर एक नया अनुक्रम बनाना चाहते हैं, तो उपयोग करें। यदि आप कुछ अनुक्रमों के तत्वों के आधार पर साइड-इफेक्ट्स (प्रिंटिंग, डेटाबेस लिखना, न्यूक्लियर वॉरहेड आदि लॉन्च करना) करना चाहते हैं, तो डोज़क का उपयोग करें।
ध्यान दें कि आलसी होते 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
, और इसके सभी मुद्रण हो चुके होंगे।