टीएल; डीआर: 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
।