x < y < z
आमतौर पर प्रोग्रामिंग भाषाओं में क्यों उपलब्ध नहीं है?
इस उत्तर में मैं यह निष्कर्ष निकालता हूं
- यद्यपि यह निर्माण भाषा के व्याकरण में लागू करने के लिए तुच्छ है और भाषा उपयोगकर्ताओं के लिए मूल्य बनाता है,
- अधिकांश भाषाओं में मौजूद नहीं होने वाले प्राथमिक कारण अन्य विशेषताओं के सापेक्ष इसके महत्व के कारण हैं और भाषाओं के संचालन की अनिच्छा या तो निकायों के लिए
- संभावित रूप से टूटने वाले परिवर्तनों से परेशान उपयोगकर्ता
- सुविधा को लागू करने के लिए कदम (यानी: आलस्य)।
परिचय
मैं इस सवाल पर एक पायथनवादी दृष्टिकोण से बोल सकता हूं। मैं इस सुविधा के साथ एक भाषा का उपयोगकर्ता हूं और मुझे भाषा के कार्यान्वयन विवरण का अध्ययन करना पसंद है। इसके अलावा, मैं C और C ++ जैसी भाषाओं को बदलने की प्रक्रिया से कुछ हद तक परिचित हूं (आईएसओ मानक समिति द्वारा शासित है और वर्ष तक इसका संस्करण है।) और मैंने रूबी और पायथन दोनों पर ब्रेकिंग परिवर्तन लागू किए हैं।
पायथन के प्रलेखन और कार्यान्वयन
डॉक्स / व्याकरण से, हम देखते हैं कि हम तुलना ऑपरेटरों के साथ किसी भी संख्या के भावों की श्रृंखला बना सकते हैं:
comparison ::= or_expr ( comp_operator or_expr )*
comp_operator ::= "<" | ">" | "==" | ">=" | "<=" | "!="
| "is" ["not"] | ["not"] "in"
और प्रलेखन आगे बताता है:
तुलनाएँ मनमाने ढंग से की जा सकती हैं, उदाहरण के लिए, x <y <= z, x <y और y <= z के बराबर है, सिवाय इसके कि y का मूल्यांकन केवल एक बार किया जाता है (लेकिन दोनों मामलों में z का मूल्यांकन तब नहीं किया जाता है जब x <y पाया जाता है झूठा होना)।
तार्किक साम्य
इसलिए
result = (x < y <= z)
तार्किक है बराबर के मूल्यांकन के संदर्भ में x
, y
है, और z
, एक अपवाद के रूप y
में दो बार मूल्यांकन किया जाता है:
x_lessthan_y = (x < y)
if x_lessthan_y: # z is evaluated contingent on x < y being True
y_lessthan_z = (y <= z)
result = y_lessthan_z
else:
result = x_lessthan_y
फिर, अंतर यह है कि y का मूल्यांकन केवल एक समय के साथ किया जाता है (x < y <= z)
।
(ध्यान दें, कोष्ठक पूरी तरह से अनावश्यक और निरर्थक हैं, लेकिन मैंने उन्हें अन्य भाषाओं से आने वाले लोगों के लाभ के लिए उपयोग किया है, और उपरोक्त कोड काफी कानूनी पायथन है।)
पार्स किए गए सार सिंटेक्स ट्री का निरीक्षण
हम निरीक्षण कर सकते हैं कि पायथन ने तुलनात्मक संचालकों को कैसे प्रशिक्षित किया:
>>> import ast
>>> node_obj = ast.parse('"foo" < "bar" <= "baz"')
>>> ast.dump(node_obj)
"Module(body=[Expr(value=Compare(left=Str(s='foo'), ops=[Lt(), LtE()],
comparators=[Str(s='bar'), Str(s='baz')]))])"
इसलिए हम देख सकते हैं कि यह वास्तव में पाइथन या किसी अन्य भाषा को पार्स करने के लिए मुश्किल नहीं है।
>>> ast.dump(node_obj, annotate_fields=False)
"Module([Expr(Compare(Str('foo'), [Lt(), LtE()], [Str('bar'), Str('baz')]))])"
>>> ast.dump(ast.parse("'foo' < 'bar' <= 'baz' >= 'quux'"), annotate_fields=False)
"Module([Expr(Compare(Str('foo'), [Lt(), LtE(), GtE()], [Str('bar'), Str('baz'), Str('quux')]))])"
और वर्तमान में स्वीकार किए गए उत्तर के विपरीत, टर्नरी ऑपरेशन एक जेनेरिक तुलना ऑपरेशन है, जो पहली अभिव्यक्ति लेता है, विशिष्ट तुलनाओं का एक पुनरावृत्ति और आवश्यक के रूप में मूल्यांकन करने के लिए अभिव्यक्ति नोड्स का एक चलने योग्य है। सरल।
पाइथन पर निष्कर्ष
मैं व्यक्तिगत रूप से रेंज शब्दार्थ को काफी सुरुचिपूर्ण मानता हूं, और मुझे पता है कि अधिकांश पायथन पेशेवर इस सुविधा का उपयोग करने के लिए इसे नुकसान पहुंचाने पर विचार करने के बजाय प्रोत्साहित करेंगे - शब्दार्थ अच्छी तरह से प्रतिष्ठित प्रलेखन में स्पष्ट रूप से कहा गया है (जैसा कि ऊपर उल्लेख किया गया है)।
ध्यान दें कि कोड लिखा होने की तुलना में बहुत अधिक पढ़ा जाता है। कोड की पठनीयता में सुधार करने वाले परिवर्तनों को गले लगाया जाना चाहिए, न कि भय, अनिश्चितता और संदेह के सामान्य दर्शकों को बढ़ाकर ।
तो प्रोग्रामिंग भाषाओं में x <y <z आमतौर पर उपलब्ध क्यों नहीं है?
मुझे लगता है कि ऐसे कारणों का संगम है जो फ़ीचर के सापेक्ष महत्व और भाषाओं के राज्यपालों द्वारा अनुमत परिवर्तन की सापेक्ष गति / जड़ता के आसपास केंद्र हैं।
अन्य महत्वपूर्ण भाषा सुविधाओं के बारे में भी इसी तरह के प्रश्न पूछे जा सकते हैं
जावा या C # में एकाधिक वंशानुक्रम उपलब्ध क्यों नहीं है? प्रश्न के लिए यहाँ कोई अच्छा जवाब नहीं है । शायद डेवलपर्स बहुत आलसी थे, जैसा कि बॉब मार्टिन ने आरोप लगाया है, और दिए गए कारण केवल बहाने हैं। और कई विरासत कंप्यूटर विज्ञान में एक बहुत बड़ा विषय है। यह निश्चित रूप से ऑपरेटर की तुलना में अधिक महत्वपूर्ण है।
साधारण वर्कअराउंड मौजूद हैं
तुलना करने वाला ऑपरेटर शाइनिंग सुरुचिपूर्ण है, लेकिन किसी भी तरह से कई उत्तराधिकार के रूप में महत्वपूर्ण नहीं है। और जैसे जावा और C # में वर्कअराउंड के रूप में इंटरफेस है, वैसे ही हर भाषा कई तुलनाओं के लिए है - आप बस बूलियन और "s के साथ तुलना की श्रृंखला बनाते हैं, जो आसानी से पर्याप्त काम करता है।
अधिकांश भाषाएं समिति द्वारा शासित होती हैं
अधिकांश भाषाएं समिति द्वारा विकसित हो रही हैं (बल्कि एक समझदार परोपकारी तानाशाह के लिए जीवन की तरह है, जैसे कि पायथन के पास है)। और मैं अनुमान लगाता हूं कि इस मुद्दे को सिर्फ अपनी संबंधित समितियों से बाहर करने के लिए पर्याप्त समर्थन नहीं मिला है।
क्या जो भाषाएँ इस सुविधा को प्रस्तुत नहीं करती हैं, वे बदल सकती हैं?
यदि कोई भाषा x < y < z
अपेक्षित गणितीय शब्दार्थ के बिना अनुमति देती है , तो यह एक ब्रेकिंग परिवर्तन होगा। यदि यह पहली जगह में इसकी अनुमति नहीं देता है, तो इसे जोड़ना लगभग तुच्छ होगा।
ब्रेकिंग परिवर्तन
ब्रेकिंग परिवर्तन वाली भाषाओं के बारे में: हम अपडेट भाषाओं को ब्रेकिंग व्यवहार परिवर्तनों के साथ करते हैं - लेकिन उपयोगकर्ता ऐसा नहीं करते हैं, विशेष रूप से उन सुविधाओं के उपयोगकर्ता जो टूट गए हैं। यदि कोई उपयोगकर्ता के पूर्व व्यवहार पर भरोसा कर रहा है x < y < z
, तो वे संभवतः जोर से विरोध करेंगे। और चूंकि अधिकांश भाषाएं समिति द्वारा शासित होती हैं, मुझे संदेह है कि हम इस तरह के बदलाव का समर्थन करने के लिए बहुत अधिक राजनीतिक इच्छाशक्ति प्राप्त करेंगे।