क्या अजगर ब्लॉक में तकनीकी रूप से उदासीन है?


19

यह वास्तव में सिर्फ एक अजगर नौसिखिया द्वारा एक सैद्धांतिक सवाल है जो अधिक समझना चाहता है।

मैं अजगर में ब्लॉक प्रारंभिक बयानों के बाद बृहदान्त्र को भूल जाता हूं। मेरा मतलब है:

  • for <variable> in <sequence>:
  • if <blah blah>:

मेरा विचार यह है कि एक कारण जो मैं भूल रहा हूं, वह यह है कि वे वास्तविक रूप से निहित हैं: बृहदान्त्र या नहीं, कथन उस रेखा के साथ समाप्त होता है।

मेरा प्रश्न - जो मैं यह जानने के लिए पूछता हूं कि अजगर सिंटैक्स कैसे काम करता है - क्या, क्या कोलन वास्तव में अनावश्यक है? क्या मैं अजगर सिंटैक्स को बदलना चाहता था ताकि बृहदान्त्र अब जरूरी न हो, क्या कुछ टूट जाएगा? क्या इससे कुछ कथन अस्पष्ट या असंभव हो जाएंगे?


4
मुझे लगता है कि आप उस प्रश्न को नहीं समझते हैं, जो यह है कि क्या काम करने के लिए सिंटैक्स के लिए कॉलोन आवश्यक हैं। इसके अलावा, कोई फर्क नहीं पड़ता कि आपका जवाब क्या है, इसमें स्पष्टीकरण भी होना चाहिए।
टॉम ज़ातो -

शायद, क्या आप प्रश्न के कुछ हिस्सों को फिर से लिख सकते हैं, ताकि मैं इस मामले में आपकी अंतर्दृष्टि से लाभ उठा सकूं, शायद एक उदाहरण? आप सबसे अच्छे न्यायाधीश होंगे, मुझे लगता है कि मैं आपके पूछने के इरादे के बारे में स्पष्ट हूँ। क्या इसका मतलब है दुभाषिया / संकलक के पार्सर के स्तर पर? बहुत बहुत धन्यवाद।
bhan sur

मैं नहीं जानता कि इसे किसी भी बेहतर तरीके से कैसे वाक्यांश दिया जाए। मेरा प्रश्न मूल रूप से, अगर आप सभी अजगर वाक्य रचना को बदल सकता है इतना है कि यह नहीं रह गया है के बाद पेट के की जरूरत है if, else, whileऔर इतने पर। यदि आपने ऐसा किया, तो क्या अजगर अब भी ऐसी भाषा होगी जिसका इस्तेमाल अस्पष्टता के बिना किया जा सकता है?
टॉम ज़ातो -

समझ गया! यह अजगर के सिंटैक्स डिज़ाइन निर्णयों के आसपास का प्रश्न है । क्षमा करें, इसे गलत समझा। समझाने के लिए धन्यवाद।
भान सुर २

अटकलें। यह वैसा ही है जैसे व्यवहार में व्याख्याताओं / पार्सरों द्वारा पता लगाने के लिए लाइन ब्रेक कठिन हैं या पठनीयता के लिए हैं। LUA में आप if .. then .. endएक ही लाइन में लिख सकते हैं । इसलिए यहां अजगर thenको दो चीजों द्वारा प्रतिस्थापित किया जाता है एक :और एक आवश्यक न्यूलाइन। इनमें से एक बेमानी लगता है।
भान सुर २ b

जवाबों:


9

हां, कुछ निर्माणों की अवहेलना करने के लिए बृहदान्त्र की आवश्यकता होती है। उदाहरण के लिए, पर विचार करें if x - y < z: pass। बृहदान्त्र के बिना हम यह तय नहीं कर सकते कि एक्स, वाई और जेड के संदर्भ को जाने बिना इसे कैसे पार्स किया जाए। if x: -y < z...यदि x बूलियन if x - y < z:है तो मान्य है, अन्यथा मान्य है।

जैसा कि प्रोग्रामिंग लैंगगॉव के लिए यह एक बहुत अच्छा विचार है कि आपको उस एप्लिकेशन को निष्पादित करने की आवश्यकता नहीं है जिस बिंदु पर आप इसे पार्स करने में सक्षम होने के लिए संकलन कर रहे हैं, बृहदान्त्र बहुत आवश्यक है। आप इसे छोड़ सकते हैं, लेकिन आपको अन्य तरीकों की आवश्यकता होगी।


1
रुको, आप एक ही लाइन पर बृहदान्त्र के बाद एक बयान कर सकते हैं? मुझे पूरा यकीन था कि इसकी अनुमति नहीं है।
टॉम ज़ातो -

1
इसकी अनुमति है, लेकिन इसके बाद केवल एक लाइनब्रेक के साथ।
फूली

अभी भी थोड़ी उलझन है। क्या यह अनुमति है: if condition: print("Condition passed")\nअनुमति दी गई? \nप्रिंट स्टेटमेंट के बाद नई लाइन का प्रतीक है।
टॉम ज़ातो -

ज़रूर, बस कोशिश करो।
रेमकोगर्लिच

1
@ टोमसज़ातो: हाँ, आप बृहदान्त्र के बाद कोई भी बयान दे सकते हैं। यह तुरंत ब्लॉक को समाप्त कर देता है, इसलिए यह मुख्य रूप से उपयोगी है जब ब्लॉक एक छोटा लाइनर हो।
रयान

14

बृहदान्त्र वास्तव में आवश्यक नहीं है व्याकरणिक रूप से, पायथन को एक अलग दुनिया में डिजाइन किया गया था, यह काफी बोधगम्य है कि भाषा डिजाइनर बृहदान्त्र की आवश्यकता के लिए तय नहीं कर सकता है। और वास्तव में कोबरा जैसी भाषाएं ऐसा करती हैं।

अजगर में बृहदान्त्र की आवश्यकता का मुख्य कारण मानव पठनीयता है। से उद्धृत करने के लिए अजगर पूछे जाने वाले प्रश्न :

यदि / if / def / class कथनों के लिए कॉलन की आवश्यकता क्यों है?

बृहदान्त्र को मुख्य रूप से पठनीयता (प्रयोगात्मक एबीसी भाषा के परिणामों में से एक) को बढ़ाने की आवश्यकता होती है। इस पर विचार करो:

if a == b
    print(a)

बनाम

if a == b:
    print(a)

ध्यान दें कि दूसरे को पढ़ना कितना आसान है। आगे नोटिस करें कि इस सामान्य प्रश्न के उत्तर में कोलन कैसे सेट करता है; यह अंग्रेजी में एक मानक उपयोग है।

एक और मामूली कारण यह है कि बृहदान्त्र सिंटैक्स हाइलाइटिंग के साथ संपादकों के लिए आसान बनाता है; वे यह तय करने के लिए कॉलन को देख सकते हैं कि प्रोग्राम टेक्स्ट के अधिक विस्तृत पार्स करने के लिए इंडेंटेशन को बढ़ाने की आवश्यकता है।

जैसा कि अक्सर पूछे जाने वाले प्रश्न में उल्लेख किया गया है, बृहदान्त्र भी भाषा को पूरी तरह से पार्स किए बिना अजगर कोड को संसाधित करना आसान बनाता है। कोई भी टेक्स्ट प्रोसेसर जिसमें एक पूर्ण पार्सर है, जिसमें अजगर संकलक भी शामिल है, बिना कोलन के ऐसा कर सकता है जिसकी आवश्यकता नहीं थी या यदि यह बिना अनुमति के वैकल्पिक हो जाता है।


4
"ध्यान दें कि दूसरे को पढ़ना कितना आसान है।" मुझे लगता है कि पढ़ने के लिए पहला आसान है। कम शोर।
user76284

10

यह कंप्यूटर के लिए आवश्यक नहीं है, लेकिन मनुष्यों के लिए है।

गुइडो वैन रोसुम (पायथन के निर्माता) ने थोड़ी देर के लिए पायथन इतिहास ब्लॉग बनाया था। कोलोन को एबीसी में पेश किया गया था , जो पायथन की कई विशेषताओं का स्रोत है।

में पर "कैरिन Dewar, इंडेंटेशन और बृहदान्त्र" इस ब्लॉग पोस्ट , गुइडो लिखते हैं:

और यहाँ मैं लैम्बर्ट के अनुरोध पर विरोधाभास करूंगा।

1978 में, जैबलोना (पोलैंड) की एक हवेली में एक डिजाइन सत्र में, रॉबर्ट देवर, पीटर किंग, जैक श्वार्ट्ज और लैंबर्ट बी के लिए विभिन्न वैकल्पिक प्रस्तावित वाक्यविन्यासों की तुलना कर रहे थे, प्रत्येक विकल्प में नीचे लिखे गए (छोटी गाड़ी) बबल सॉर्ट कार्यान्वयन की तुलना करके। चूंकि वे सहमत नहीं हो सकते थे, रॉबर्ट देवर की पत्नी को उनके कमरे से बुलाया गया और उनसे उनकी राय मांगी गई, जैसे कि एक आधुनिक पेरिस ने हेरा, एथेना और एफ्रोडाइट की सुंदरता की तुलना करने के लिए कहा। लेकिन पहले संस्करण के बाद उसे समझाया गया था, उसने टिप्पणी की: "आपका मतलब है, उस पंक्ति में जहां यह कहता है: 'फ़ॉर आई ...', कि इसे उन पंक्तियों के लिए किया जाना चाहिए जो अनुसरण करते हैं; न कि केवल उस पंक्ति के लिए। ! " और यहां वैज्ञानिकों ने महसूस किया कि अगर उस रेखा के अंत में एक बृहदान्त्र होता तो गलतफहमी से बचा जाता।

( बी यहां प्रोटोटाइप भाषाओं की एक श्रृंखला है B0, B1, ... जिसके कारण ABC बन गया। यह B भाषा नहीं है जो C की पूर्ववर्ती है)।

मुझे यह भी याद है कि 90 के दशक में गुइडो ने इशारा किया था कि यह संपादकों के लाभ के लिए है , जो एक बृहदान्त्र के साथ समाप्त होने वाली रेखा के बाद स्वचालित रूप से एक इंडेंट डाल सकता है। लेकिन मुझे अभी तक इसके लिए कोई स्रोत नहीं मिला है।


4

कोबरा प्रोग्रामिंग भाषा की वाक्य रचना भारी पायथन के से प्रेरित है, और यह, पेट को दूर करता है तो ऐसा लगता है कि यह सख्ती से आवश्यक नहीं है। हालांकि, यह केवल बृहदान्त्र को हटाने के लिए पर्याप्त नहीं है , सिंटैक्स के लिए अन्य परिवर्तनों की आवश्यकता है। उदाहरण के लिए, मेरी एक खिलौना परियोजना से कोड का यह टुकड़ा :

kons  = lambda hd, tl: lambda x: hd if x else tl
virst = lambda l: l(True )
rrest = lambda l: l(False)

शरीर को पैरामीटर सूची से अलग करने के लिए बृहदान्त्र के बिना, मुझे इंडेंटेशन का उपयोग करना होगा:

kons  = lambda hd, tl
    lambda x
        hd if x else tl

virst = lambda l
    l(True )

rrest = lambda l
    l(False)

मेरा मानना ​​है कि कोबरा के पहले के संस्करणों ने कोलन को वैकल्पिक बना दिया था, आप इंडेंटेशन या कोलन या दोनों का उपयोग कर सकते थे। रूबी में यह कैसे काम करता है, इसके समान है, जहाँ नियंत्रण अभिव्यक्तियों के विभिन्न भागों को अलग करने के लिए खोजशब्द हैं, लेकिन आप अभिव्यक्ति विभाजकों (अर्धविराम या न्यूलाइन) का भी उपयोग कर सकते हैं:

# idiomatic
while true do puts "I am awesome" end
#          ↑↑

# non-idiomatic, but legal
while true; puts "I am awesome" end
#         ↑

# non-idiomatic, but legal
while true
puts "I am awesome" end

# idiomatic
while true
  puts "I am awesome"
end

कोबरा के वर्तमान संस्करणों में, आप अल्पविराम का उपयोग कर सकते हैं:

if x
    y

के रूप में लिखा जा सकता है

if x, y

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

पूरी तरह से सुनिश्चित करने का एकमात्र तरीका यह है कि बृहदान्त्र के साथ और बिना सिंटैक्स को औपचारिक रूप दिया जाए और इसकी गैर-अस्पष्टता साबित की जाए।

ध्यान दें, हालांकि, कि पायथन के ज़ेन के पूर्वजों में से एक है "स्पष्ट इम्प्लिक्ट से बेहतर है", इसलिए कॉलोन के साथ ब्लॉकों का स्पष्ट रूप से फैलाव पायथन के सामान्य दर्शन के साथ फिट लगता है। डिजाइन और इतिहास पूछे जाने वाले प्रश्न यह भी कहा गया है कि यह निर्णय अजगर के पूर्ववर्ती, एबीसी से अनुभवजन्य साक्ष्य पर आधारित है।


3
खैर, अंतिम पैराग्राफ में वर्णित उस दर्शन के साथ, आपको हर पंक्ति के अंत में कोलन की आवश्यकता हो सकती है। स्पष्ट बनाम निहित केवल तभी समझ में आता है जब स्पष्ट रूप से जानकारी जोड़ता है (उदाहरणार्थ अंतर्निहित संस्करण अस्पष्ट है)। जो मेरे सवाल का बिंदु था।
टॉम ज़ातो -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.