standard Scheme में यह संभव हैरैकेट से एक-सशस्त्र "अगर" गायब क्यों है?
(if (> x 2)
(set! x (- x 1)))
लिखने के लिए, लेकिन इस रैकेट में संभव नहीं है - रैकेट के if
हमेशा दो हाथ की आवश्यकता है। क्यूं कर?
standard Scheme में यह संभव हैरैकेट से एक-सशस्त्र "अगर" गायब क्यों है?
(if (> x 2)
(set! x (- x 1)))
लिखने के लिए, लेकिन इस रैकेट में संभव नहीं है - रैकेट के if
हमेशा दो हाथ की आवश्यकता है। क्यूं कर?
दलील
if
में से एक सशस्त्र संस्करण रैकेट से निकाल दिया गया कीड़े को रोकने के लिए।
कार्यात्मक कोड में हमेशा if
के दो-सशस्त्र संस्करण का उपयोग करता है।
(if test expr-on-true expr-on-false)
दूसरे हाथ expr-on-false
एक वाक्य रचना त्रुटि के लिए नेतृत्व नहीं करेंगे भूलकर, लेकिन एक रनटाइम त्रुटि के लिए (अभिव्यक्ति #<void>
वापसी होगी)।
कार्यात्मक कोड में इन अक्सर होने वाली बग को रोकने के लिए, if
के एक सशस्त्र संस्करण के लिए फॉर्म when
प्रस्तुत करने का निर्णय लिया गया था।
(when test expr-on-true)
आकस्मिक कीड़े को रोकने इसके अलावा, नए रूप में स्पष्ट रूप से कोड का एक पाठक के लिए संकेत दिया, कि कोड साइड इफेक्ट पर निर्भर करता है।
मानक योजना से Porting कोड
रैकेट आप रैकेट में योजना कोड चलाने की कोशिश करते हैं और त्रुटि संदेश दिखाई
if: bad syntax (must have an "else" expression)
आप when
या unless
को if
अभिव्यक्ति को फिर से लिखने चाहिए।
आप को फिर से लिखने:
(if test expr1) to (when test expr1)
और
(if (not test) expr1) to (unless test expr1).