डोसेक और क्लोजर में क्या अंतर है? जब आप एक दूसरे का उपयोग करना चुनते हैं तो कुछ उदाहरण क्या हैं?डोसक के बीच अंतर और क्लोजर
उत्तर
अंतर यह है कि 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
आलसी है। उदाहरण Rayne के जवाब में लापता
(for [x [1 2 3]] (println x))
आरईपीएल पर है, यह आम तौर पर आप क्या चाहते हो जाएगा, लेकिन यह मूल रूप से एक संयोग है: आरईपीएल for
द्वारा उत्पादित आलसी अनुक्रम बलों, printlns होने के कारण। एक गैर-संवादात्मक वातावरण में, कभी भी मुद्रित नहीं किया जाएगा। आप क्योंकि def
प्रपत्र बनाए गए नए वर, और नहीं मूल्य है जो यह स्वाभाविक है रिटर्न
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
के परिणामों की तुलना द्वारा कार्रवाई में देख सकते हैं, आरईपीएल मुद्रित करने के लिए के लिए कुछ नहीं है, और lazy
संदर्भित करेंगे एक अवास्तविक आलसी-सीक के लिए: इसके किसी भी तत्व की गणना नहीं की गई है। eager
nil
का संदर्भ लेंगे, और इसकी सभी प्रिंटिंग की जाएगी।
डोसक असीमित आलसी अनुक्रम का मूल्यांकन कैसे करता है? बुरा विचार? केवल इसे सीमित अनुक्रमों पर कॉल करें, या तो उत्सुक या आलसी? – johnbakers
@johnbakers यह मूल्यांकन तब तक अवरुद्ध होगा जब तक कि मूल्यांकन बाधित न हो जाए। क्लोजर सीमित अनुक्रमों की तुलना में एक अलग तरीके से असीमित अनुक्रमों को संभालने का प्रयास नहीं करता है। –
- 1. क्लोजर में '() और (सूची) के बीच क्या अंतर है?
- 2. क्लोजर में कब और कब: के बीच क्या अंतर है?
- 3. "। +" और "। +?" के बीच अंतर
- 4. AJAX के बीच अंतर और
- 5. CMake: $ {} और के बीच अंतर "$ {}"
- 6. ऑब्जेक्ट और * के बीच अंतर?
- 7. $ के बीच अंतर? और PowerShell
- 8. == और मामले के बीच अंतर?
- 9. "या" और "||" के बीच अंतर
- 10. वीबीए: और + के बीच अंतर
- 11. क्लोजर के लूप और इटेटेट विधियों के बीच गति में इतना अंतर क्यों है
- 12. क्लोजर में अज्ञात कार्यों के लिए एफएन और # वाक्यविन्यास के बीच कोई अंतर है?
- 13. क्लोजर और लिस्प
- 14. स्कैला क्लोजर और जावा 8 बंद करने के बीच संगतता
- 15. लिस्प -1 और लिस्प -2 के बीच क्या अंतर है?
- 16. var और quote के बीच क्या अंतर है?
- 17. पैरामीटर परिभाषाओं के बीच अंतर (प्रकार और नाम), और (प्रकार * नाम) के बीच अंतर क्या हैं?
- 18. क्लोजर और कॉलबैक
- 19. संबंधों के बीच और कहां के बीच अंतर
- 20. क्लोजर फ़ंक्शन (एनटी [कॉल इंडेक्स]) और संरचना (अंतिम (इंडेक्स कॉल लेना) के बीच क्या अंतर है)
- 21. सामान्य लिस्प में परमाणु और क्लोजर में परमाणु के बीच क्या अंतर है?
- 22. लिस्प/क्लोजर में प्रक्रिया और # प्रक्रिया के बीच क्या अंतर है?
- 23. BOOST_CHECK_CLOSE और BOOST_CHECK_CLOSE_FRACTION के बीच अंतर?
- 24. शून्य के बीच अंतर? और खाली? योजना
- 25. मूल्य और वस्तु के बीच अंतर
- 26. कंपास और सास के बीच अंतर?
- 27. स्ट्रॉन्ग और कमजोर आईबीओटलेट्स के बीच अंतर
- 28. COM और DCOM के बीच अंतर?
- 29. "coroutine" और "धागा" के बीच अंतर?
- 30. जेपीए और जेडीओ के बीच अंतर?
शानदार उत्तर। धन्यवाद! –
अब बहुत साइड इफेक्ट्स हैं ... परमाणु हथियार लॉन्च करना :) – Marc
धन्यवाद! मैंने अपने (लंबे समय तक) बाल खींचकर "के लिए" खींच लिया था कि यह मेरी वस्तुओं की सूची में मेरे परमाणु हथियारों को कभी नहीं आग लगाता है। "doseq" निश्चित किया था। –