2009-03-14 16 views
6

मैं सक्षम होने का एक बेहोश स्मृति इस तरह की कुछ भाषा में एक अगर बयान लिखने के लिए हैं:बयान

if (foobar == ("this" || "that")) 

बजाय:

if (foobar == "this" || foobar == "that") 

उत्तरार्द्ध अधिक वर्बोज़, और इसलिए कम है सौंदर्यपूर्ण रूप से मुझे आकर्षक।

क्या पूर्व सम्मेलन किसी भी प्रमुख भाषा में समर्थित है? क्या कोई कारण है कि यह व्यापक रूप से समर्थित नहीं है?

+0

आप * * लिख सकते हैं कि ग या C++ .. यह वही नहीं करता जो आप चाहते हैं;)। –

उत्तर

4

Icon प्रोग्रामिंग भाषा में यह सुविधा है।

जनरेटर के उपयोग के माध्यम से, आप कर सकते हैं

if i = (0 | 1) then write("0 or 1") 

जो अगर मैं = 0 या मैं = 1. आप भी कर सकते हैं सफल होता है:

if (i | j | k) = (0 | 1) then write("0 or 1") 

जो मैं के किसी भी अगर सफल होता है, जे, या के बराबर 0 या 1.

इसके पीछे मूल विचार यह है कि (1|2|3..) अनुक्रमों में से प्रत्येक एक जनरेटर बनाता है जो मूल्यों से बाहर होने तक प्रत्येक मान को बदले में वापस कर देगा। जब आप इस तरह के एक बूलियन बैठने में जनरेटर का उपयोग करते हैं, तब तक जेनरेटर से मूल्यों का अनुरोध किया जाएगा जब तक कि तुलना सफल न हो जाए। जब आप तुलना के दोनों तरफ दो जेनरेटर जोड़ते हैं, तब तक सभी संभव संयोजनों का प्रयास किया जाएगा जब तक कि कोई सफल न हो जाए। (झूठी वापसी के बजाए, यदि मान बराबर नहीं हैं तो समानता ऑपरेटर "विफल हो जाता है।)

2

मुझे याद करने के लिए पास्कल में के रूप में एक in बयान था लगते हैं:

if x in (foo, bar) then 
    ... 

कारण है कि यह अधिक व्यापक रूप से समर्थित नहीं है के रूप में, मुझे धड़कता है। यह वाक्य रचनात्मक चीनी का एक बहुत अच्छा टुकड़ा की तरह लगता है।

+0

समान चीज़ पाइथन में भी काम करती है –

+0

पास्कल में सिंटैक्स सेट का उपयोग करता है, जो एक अभिन्न प्रकार का होना था। पास्कल का कोई संस्करण नहीं है कि मैं तारों के समर्थित सेटों से अवगत हूं। –

+0

ऐसा लगता है जैसे मुझे एडा को भी इसका समर्थन है, शायद यह तारों को संभालने में सक्षम नहीं था। –

2

एकमात्र जगह जिसे मैं सिंटैक्स का उपयोग कर याद करता हूं, लगभग 25 साल पहले कोबोल में है।

मुझे संदेह है कि यह व्यापक रूप से समर्थित नहीं है क्योंकि यह अस्पष्टता का कारण बनता है कि संकलक हल नहीं कर सकता है। आपके विशिष्ट मामले में, यह कोई विशेष समस्या नहीं है क्योंकि "यह" और "वह" तार हैं, जिसके लिए सशर्त या ऑपरेटर को कोई समझ नहीं आता है। लेकिन इस टुकड़ा पर विचार, सी, की तरह एक भाषा जहां एक सशर्त का परिणाम एक बूलियन मान 0 या 1 है में:

int a = 22; 
int b = 99; 
int rslt = SomeFunction(); 
if (rslt == (a || b)) 

इस बिंदु पर संकलक मज़बूती से निर्धारित नहीं कर सकता तुम क्या चाहते। आप इस पर विचार करते हैं:

if (rslt == a || rslt == b) 

या, आप का इरादा था:

if ((rslt == 0 && a == 0 && b == 0) || (rslt == 1 && a == 1 && b == 1)) 

आप प्रकार कौन इस तरह के वाक्य रचना इस्तेमाल किया जा सकता सीमित हो सकती है, लेकिन फिर आप आदर्श क्या की चोटी पर अपवाद ढेर कर रहे हैं एक ऑर्थोगोनल वाक्यविन्यास होना चाहिए। यह उपयोगकर्ताओं को भ्रमित करने और संकलक जटिल करने जा रहा है।

यह असाइनमेंट स्टेटमेंट्स की तुलना में सशर्तों में अभिव्यक्तियों का मूल्यांकन करने के लिए भी मजबूर करता है। वह भी निस्संदेह संकलक जटिल होगा।

यह निश्चित रूप से काम करने के लिए किया जा सकता है, लेकिन मुझे लगता है कि इसे अधिभारित प्रतीकों के साथ नए वाक्यविन्यास की आवश्यकता होगी, और सभी एक संदिग्ध लाभ के लिए।

0

|| ऑपरेटर एक बाइनरी ऑपरेटर है जो दो ऑपरेंड लेता है और एक एकल मान देता है। अधिकांश प्रमुख भाषाओं में अभिव्यक्तियों का मूल्यांकन करने के तरीके के कारण, यह मानने के लिए कि क्या मान मूल्यों के एक सेट के बराबर है, उस वाक्यविन्यास का उपयोग करना असंभव होगा। यही कारण है कि यह ज्यादातर प्रमुख भाषाओं में समर्थित नहीं है।

in वाक्यविन्यास कि @ 1800 जानकारी पोस्ट की गई है, हालांकि, कई भाषाओं द्वारा समर्थित है। यदि यह आपकी भाषा में समर्थित नहीं है, तो आप केवल in() या in_array() नामक फ़ंक्शन बना सकते हैं, जिसमें दो तर्क, एक मान और सरणी होती है, और यदि सरणी में वह मान होता है तो true देता है। (PHP, उदाहरण के लिए, एक अंतर्निहित में in_array() कार्य करते हैं।)

1

इंटरैक्टिव कल्पना (पाठ साहसिक) संलेखन भाषा Inform 'या' ऑपरेटर (से अलग का उपयोग कर इसे समर्थन करता है, हमेशा की तरह तार्किक-या जो लिखा है '| | '):

if (qty==2 or 3) 
    print "some"; 
else 
    print "many"; 

वहाँ एक कारण है कि यह व्यापक रूप से समर्थित नहीं है है?

यह थोड़ा सा मामला-जादू है; यह स्पष्ट नहीं है कि यह किसी अन्य चीज़ में क्या करता है लेकिन सरल उदाहरण अभिव्यक्ति।

if (n or 8==m+(1 or 2) or 7) // plausible 
if (qty<4 or 5) // huh? 
a= "cat" or "dog" // er 

'अगर (अनुक्रम) में मूल्य' अजगर और अन्य आधुनिक पटकथा भाषाओं में उपलब्ध अंकन शायद अब अच्छे के लिए इस आला में ले लिया गया है।

+0

तार्किक- या '&&' लिखा गया है? मेथिंक आपके पास आपके प्रतीक गलत हैं, महोदय। –

+0

अहम। आप सही हैं, यहां तक ​​कि जानकारी भी विपरीत नहीं है! – bobince

0

अजगर में आप इस

if(foobar in ('this', 'that', 'and something else')) 

तरह लिख सकते हैं ('यह', 'कि', 'और कुछ') - यह एक सूची प्रकार है।

तो, मैं किसी भी OOP भाषा में लगता है कि आप अपने खुद के वर्ग बना सकते हैं:

MyClass(object): 

    List values 

    def in(value): 
    return search_value_in_values(value) 

और लिखने कुछ इस तरह:

if(new MyClass('this', 'that', 'and something else').in(foobar)) 
संबंधित मुद्दे