टीएल; डीआर: when दुष्प्रभाव के बारे में andहै, शुद्ध बूलियन अभिव्यक्तियों के लिए है।
जैसा कि आपने देखा है, andऔर whenकेवल सिंटैक्स में भिन्न है, लेकिन अन्यथा पूरी तरह से समकक्ष हैं।
सिंटैक्टिक अंतर काफी महत्वपूर्ण है, हालांकि: चारों ओर whenएक निहित लपेटता है prognलेकिन पहला तर्क बनता है। prognएक स्वाभाविक रूप से अनिवार्य विशेषता है: यह केवल उनके साइड इफेक्ट्स के लिए सभी लेकिन बहुत अंतिम शरीर के रूप का मूल्यांकन करता है, जो भी मूल्य वापस लौटाता है उसे छोड़ देता है।
जैसे, whenएक अनिवार्य रूप के रूप में अच्छी तरह से है: यह मुख्य उद्देश्य साइड-इफेक्टिंग रूपों को लपेटना है, क्योंकि शरीर के लिए वास्तव में बहुत अंतिम रूप का केवल मूल्य मायने रखता है।
andदूसरी ओर एक शुद्ध कार्य है, जिसका मुख्य उद्देश्य दिए गए तर्क रूपों के रिटर्न मानों को देखना है: जब तक आप स्पष्ट रूप prognसे इसके किसी भी तर्क के चारों ओर लपेटते हैं, तब तक प्रत्येक तर्क फॉर्म का मूल्य महत्वपूर्ण है, और कोई भी मूल्य कभी भी नजरअंदाज नहीं किया जाता है। ।
इसलिए, के बीच वास्तविक अंतर andऔर whenशैलीगत है: आप andशुद्ध बूलियन अभिव्यक्तियों के लिए उपयोग करते हैं, और whenसाइड-इफेक्टिंग रूपों के चारों ओर एक गार्ड लगाने के लिए।
इसलिए, ये खराब शैली हैं:
;; `when' used for a pure boolean expression
(let ((use-buffer (when (buffer-live-p buffer)
(file-exists-p (buffer-file-name buffer)))))
...)
;; `and' used as guard around a side-effecting form
(and (buffer-file-name buffer) (write-region nil nil (buffer-file-name buffer)))
और ये अच्छे हैं:
(let ((use-buffer (and (buffer-live-p buffer)
(file-exists-p (buffer-file-name buffer)))))
...)
(when (buffer-file-name buffer)
(write-region nil nil (buffer-file-name buffer)))
मुझे पता है कि कुछ लोग इस बारे में असहमत हैं, और खुशी से andसाइड-इफ़ेक्ट का उपयोग करते हैं, लेकिन मुझे लगता है कि यह वास्तव में खराब शैली है। हमारे पास एक कारण के लिए ये विभिन्न रूप हैं: सिंटैक्स मायने रखता है । यदि ऐसा नहीं होता है, तो हम केवल कभी भी उपयोग करेंगे if, जो केवल सशर्त रूप से आपको Emacs Lisp शब्दार्थ में आवश्यक है। अन्य सभी बूलियन और सशर्त रूपों के संदर्भ में लिखा जा सकता है if।