क्योंकि IF (< - HyperSpec लिंक) के लिए वाक्य रचना के रूप में परिभाषित किया गया है:
if test-form then-form [else-form] => result*
कोई शुरू कर रहे हैं या अंत मार्करों। एक फिर-फार्म है और फिर नहीं - फॉर्म *। प्रोग्न फॉर्म के अनुक्रम को परिभाषित करने के लिए एक तंत्र है, जहां फॉर्म बाएं से दाएं से निष्पादित किए जाते हैं और अंतिम रूप के मान वापस लौटाए जाते हैं।
यह इस तरह परिभाषित किया जा सकता था: स्थिति:
my-if test-form (then-form*) [(else-form*)] => result*
(defmacro my-if (test then &optional else)
(assert (and (listp then) (listp else)) (then else))
`(if ,test (progn ,@then) (progn ,@else)))
(my-if (> (random 10) 5)
((print "high")
:high)
((print "low")
:low))
ठीक है, वहाँ पहले से ही एक निर्माण कि कई रूपों का समर्थन करता है है।
(cond ((> (random 10) 5)
(print "high")
:high)
(t
(print "low")
:low))
सामान्य शैली को COND का उपयोग करना है जब एकाधिक विकल्पों की कोशिश की जानी चाहिए और जब कई और अन्य रूप हैं। IF का उपयोग तब किया जाता है जब केवल एक परीक्षण होता है और फिर एक और दूसरा रूप होता है। अन्य मामलों के लिए कब और अनल्य है। कब और अनल्य समर्थन केवल एक या फिर फॉर्म (कोई और रूप नहीं)।
मुझे लगता है कि कम से कम एक सशर्त रूप (यदि इस मामले में) है तो यह अच्छा है कि ब्रांड्स के अतिरिक्त परतों के बिना आता है। लेखन
(if (> (random 10) 5)
(progn
(print "high")
:high)
(progn
(print "low")
:low))
तब भुगतान करने के लिए एक छोटी सी कीमत है। या तो अतिरिक्त प्रोग्न लिखें या COND संस्करण पर स्विच करें। यदि आपका कोड वास्तव में कई से IF से लाभान्वित होगा और अन्य रूपों के साथ, तो बस उस मैक्रो को लिखें (ऊपर देखें)। लिस्प में यह है, ताकि आप अपना खुद का भाषा डिजाइनर बन सकें। मैक्रो शुरू करने के बारे में सोचना महत्वपूर्ण है: क्या मेरा मैक्रो सही है? क्या यह त्रुटियों की जांच करता है? यह इसके लायक है? क्या यह पठनीय है (दूसरों के लिए?)?
स्रोत
2009-03-11 12:31:11
लेकिन (कब) और (जब तक) अन्य शाखाएं नहीं हैं। –