वैकल्पिक पैरामीटर चूक


26

एमएसीएस लिस्प में वैकल्पिक मापदंडों के गैर-शून्य चूक के लिए वाक्यविन्यास समर्थन नहीं है। इन मापदंडों की आपूर्ति के लिए अनुशंसित मुहावरा क्या है?

मेरी बात को स्पष्ट करने के लिए, ऐसा करने का एक स्पष्ट तरीका है।

(defun command (a &optional supplied-b)
  (let ((b (or supplied-b default-b)))
    (command-body a b)))

क्या, अगर कुछ भी, अनुशंसित शैली है?

जवाबों:


24

जब तक आप @legoscia द्वारा सुझाए गए सामान्य लिस्प एक्सटेंशन का उपयोग करते हैं, तब तक आपको यह जांचने की आवश्यकता है कि क्या वैकल्पिक तर्क निर्दिष्ट किया गया था। ध्यान दें कि आपको वास्तव में letयहां उपयोग करने की आवश्यकता नहीं है। यह मेरे लिए अधिक मुहावरेदार लगता है:

(defun command (a &optional b)
  (or b (setq b default))
  (command-body a b))

जैसा कि टिप्पणियों में सुझाया गया है, का उपयोग unlessकरना बेहतर हो सकता है or:

(defun command (a &optional b)
  (unless b (setq b default))
  (command-body a b))

टिप्पणियों से भी: letमूल सवाल के रूप में अधिक शुद्ध कार्यात्मक शैली का उपयोग करना होगा , लेकिन आपको अलग-अलग चर नामों की आवश्यकता नहीं है:

(defun my-command (a &optional b)
  (let ((b (or b default)))
    (command-body a b)))

बेशक, अगर वैकल्पिक पैरामीटर केवल एक बार आप इसे करना चाहिए एक बार जरूरत है:

(defun my-command (a &optional b)
    (command-body a (or b default)))

7
-1: मुझे नहीं लगता कि साइड-इफ़ेक्टिंग एक्सप्रेशन जैसे setq"प्योर" बूलियन फॉर्म में इस्तेमाल करना अच्छा स्टाइल है or। मेरी राय whenमें निश्चित रूप से यहां अधिक उपयुक्त है, लेकिन आम तौर पर letस्थानीय बाइंडिंग को स्थापित करने या बदलने के लिए पसंद की अभिव्यक्ति है। IOW, मूल कोड मुझे बहुत अच्छा लगता है।
चंद्रोदय

3
मैं मानता हूं कि ऐसा कुछ (unless b (setq b default)बेहतर हो सकता है। व्यक्तिगत रूप से, मुझे लगता letहै कि यहाँ बेमानी है क्योंकि bपहले से ही स्थानीय है defun
ग्लूकोज

3
यह स्वाद की बात है, लेकिन मैं शुद्ध कोड और शुद्ध बाइंडिंग पसंद करता हूं, जैसे letकि साइड-इफ़ेक्टिंग फॉर्म पर setq। यह एक पैरामीटर डिफ़ॉल्ट के लिए कोड है, लेकिन setqस्थानीय चर को बदलने के लिए उदार उपयोग कोड को पढ़ने और पालन करने के लिए कठिन बनाता है। मुझे लगता है कि सभी स्थानीय बाइंडिंग को अपरिवर्तनीय मानना ​​सबसे अच्छा है, और केवल नए बाइंडिंग को स्थापित करना है let। IOW, जरूरी एक पर एक कार्यात्मक शैली पसंद करते हैं।
चंद्रोदय

22

आप उपयोग कर सकते हैं cl-defun, जो आपको वैकल्पिक तर्कों के लिए एक डिफ़ॉल्ट मान निर्दिष्ट करने देता है:

(cl-defun command (a &optional (b default-b))
  (command-body a b))

डिफ़ॉल्ट मूल्य, इस मामले में default-b, हर बार फ़ंक्शन को कॉल करने के बाद मूल्यांकन किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.