स्विफ्ट को अर्धविराम की आवश्यकता क्यों नहीं है? [बन्द है]


20

मैं आम तौर पर सी # या ऑब्जेक्टिव-सी में कोड करता हूं और हाल ही में इसे ऐप्पल की नई प्रोग्रामिंग भाषा - स्विफ्ट सीखने के लिए खुद पर ले गया।

पहली बात जो मैंने देखी, वह यह है कि स्विफ्ट में एक पंक्ति को समाप्त करने के लिए आपको अर्धविराम को जोड़ने की आवश्यकता नहीं है, लेकिन अगर आपने कम से कम जो मैंने परीक्षण किया है, तो-यह संकलक के साथ हस्तक्षेप नहीं करता है।

जब मैं लिखता हूं:

int someNumber = 0;

ऑब्जेक्टिव-सी में अर्धविराम प्रोग्राम को बताता है कि लाइन खत्म हो गई है और अगली लाइन तक नहीं जा रही है।

स्विफ्ट के साथ मैं एक चर घोषित कर सकता हूं

var someNumber:Int = 5

और अर्धविराम न जोड़ें और सिस्टम जानता है कि यह पंक्ति का अंत है।

कुछ भाषाओं को ऐसा करने की अनुमति देता है और दूसरों को नहीं? अर्धविराम को अंत तक जोड़ने की एक समान प्रणाली क्यों नहीं रखी गई?


हर कोई अन्य भाषाओं से नहीं आता है, इसलिए उन्हें यह भी पता होगा कि वे एक समान नहीं हैं? क्या ऐप्पल उद्देश्य-सी भागों से छुटकारा पाने के लिए स्विफ्ट के साथ अधिक नए प्रोग्रामर को आकर्षित नहीं करेगा जो कि कई लोग नापसंद करते हैं?
जेएफओ

2
Obj-C vets के बहुत सारे Swift से नाखुश हैं और बहुत पसंद करते हैं Obj-C। इसे Apple मंचों के माध्यम से देखा जा सकता है। स्विफ्ट केवल 2014 में ही बाहर आ गई थी और यदि फुल बग्स और परिवर्तन हर कुछ महीनों में भाषा के साथ होते हैं तो स्विफ्ट 2.0 इस गिरावट से बाहर आता है। स्विफ्ट ओब्ज-सी पर आधारित है, लेकिन इसका उद्देश्य अधिक सादे अंग्रेजी के साथ सीखने के लिए कोडिंग को आसान बनाना है।
मेमज

पुराने संकलक कार्यान्वयनकर्ता आलसी थे और / या सरल पार्सिंग के साथ अधिक कुशल होना था। अब इसकी कोई आवश्यकता नहीं है। यह स्थानीय प्रकार के निष्कर्ष के समान है, आपके पास केवल यह नहीं है यदि आपका संकलक लेखक आलसी है और डेवलपर अनुभव की परवाह नहीं करता है।
Ebuall

जवाबों:


18

कुछ भाषाओं को ऐसा करने की अनुमति देता है और दूसरों को नहीं? अर्धविराम को अंत तक जोड़ने की एक समान प्रणाली क्यों नहीं रखी गई?

रॉबर्ट ने स्विफ्ट के बारे में एक अच्छा जवाब दिया, मैं सामान्य रूप से पार्सिंग के बारे में थोड़ा और जोड़ने की कोशिश करूँगा और अर्धविराम का उपयोग क्यों करूं या नहीं।

जब आप प्रोग्राम को संकलित करते हैं, तो आपकी स्रोत फ़ाइल को निष्पादन योग्य कोड में बदलने से पहले कई चरण होते हैं, पहले पढ़ने और पार्स करने में से एक । पार्सिंग के दौरान आपका कोड भाषा के व्याकरण के अनुसार वर्णों के अनुक्रम से एक संरचित प्रतिनिधित्व में बदल जाता है । इसके लिए यह आवश्यक है कि आपके कोड (चर, स्थिरांक, घोषणा आदि) को बनाने वाले तत्वों को किसी तरह पहचाना और अलग किया जाए। जब आप एक घोषणा करते हैं जैसे:

int someNumber = 0;

यह सिर्फ पात्रों का एक क्रम है जिसे किसी भी तरह "someNumberint0 अवधारणा बनाने के लिए" टाइप नामक चीज़ को चालू करना होगा और इसे असाइन करना होगा

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

int someNumber = 0;
int otherNumber = 1;

आपको यह जानना होगा कि वे दो अलग-अलग घोषणाएं हैं। ;में सी जैसी भाषाओं तो पार्सर पात्रों जब तक यह एक पाता है पढ़ता है, और समझने के लिए सिर्फ एक बयान के रूप में पढ़ा गया था प्रयास, उस के लिए प्रयोग किया जाता है। यह अनुमति देता है, जैसा कि रॉबर्ट ने कहा, एक ही पंक्ति में कई कथन हैं, जैसे:

int someNumber = 0; int otherNumber = 1;

जिसका ठीक वैसा ही प्रभाव है जैसा कि उन्हें दो पंक्तियों में लिखना।

अन्य भाषाओं में, पायथन की तरह , आपको प्रत्येक कथन को एक अलग पंक्ति में रखने की उम्मीद है।

x = 3
if x < 10:
   print 'x smaller than 10'
else:
   print 'x is bigger than 10 or equal'

तो कोई जोड़ने की आवश्यकता नहीं है ;, क्योंकि भाषा ही आपको उसी पंक्ति में कथन जोड़ने से रोकती है!

फिर भी अन्य भाषाएं, जैसे LISP या स्कीम , समूहबद्ध बयानों का एक बहुत अलग तरीका है (ठीक है, वे वास्तव में वक्तव्य नहीं हैं, लेकिन आइए अब इसके लिए इसे अनदेखा करें)। तो आपके पास हर चीज के लिए बस कोष्ठक है:

(define (do-stuff x)
  (begin
    (display (format "value: ~a" x))
    x))

फिर से, आप की जरूरत नहीं है ;सिर्फ इसलिए कि आप एक ही प्रतीकों (का उपयोग ), (बातों के लिए) है कि में अन्य भाषाओं हैं {, }, :, आदि कोई है जो केवल लिस्प वाक्य रचना जानता है आप पूछ सकते हैं: क्यों आप की क्या ज़रूरत है ;अपने बयान के अंत में ?

बस एक अजनबी उदाहरण जोड़ने के लिए: OCaml न केवल बयानों के अंत में एक अर्धविराम है ... यह दो है!

let rec fact x =
    if x <= 1 then 1 else x * fact (x - 1);;

क्यों? मुझे नहीं पता। :)

विभिन्न भाषाओं को अलग-अलग उद्देश्यों और अलग-अलग दर्शन के साथ डिज़ाइन किया गया है। यदि सभी भाषाएँ समान वाक्य-विन्यास और रूढ़ियों को साझा करती हैं, तो वे शायद आपको केवल उसी तरह से काम करने की अनुमति देंगी।


4
अच्छा समापन वाक्य।
थॉमस एडिंग

अच्छे उदाहरण हैं, लेकिन आपने सवाल का जवाब नहीं दिया।
रोबो रोबोक

अतिरिक्त डेटा बिंदु: कुछ भाषाएं सी-स्टाइल परिवार के लिए एक तरह का रिवर्स-एप्रोच लेती हैं: जैसे कि हाइपरटॉक लाइन के हार्ड अंत के रूप में लाइन ब्रेक का उपयोग करता है (अर्धविराम के बजाय), और यदि आप एक बयान जारी रखना चाहते हैं, तो लाइन से बचने की आवश्यकता होती है कई लाइनों पर। फनीली, सी का बहुत ही प्रीप्रोसेसर भी इस तरह से काम करता है।
20

11

किसी स्टेटमेंट के अंत को सीमांकित करने के लिए अर्धविराम के बजाय लाइन ब्रेक का उपयोग किया जाता है।

में भाषा गाइड: मूल बातें यह कहते हैं:

कई अन्य भाषाओं के विपरीत, स्विफ्ट को आपको अपने कोड में प्रत्येक कथन के बाद अर्धविराम (?) लिखने की आवश्यकता नहीं है, हालाँकि आप चाहें तो ऐसा कर सकते हैं। यदि आप एक ही पंक्ति में कई अलग-अलग कथन लिखना चाहते हैं, तो अर्धविराम की आवश्यकता होती है।

क्यों? क्योंकि यही भाषा डिजाइनर इसे करना चाहते थे।

संकेत के ऊपर दूसरा वाक्य आपको अर्धविराम की आवश्यकता क्यों नहीं है; अधिकांश कथन सिंगल लाइन हैं। इस बबल सॉर्ट उदाहरण को ध्यान से देखें; सिंगल-लाइन स्टेटमेंट और कोई अर्धविराम का संयोजन बहुत साफ वाक्यविन्यास के लिए नहीं है जो VB- जैसा है, लेकिन कम क्रिया है:

func bubbleSort<T:Comparable>(inout list:[T]) {
    var done = false
    while !done {
        done = true
        for i in 1..<list.count {
            if list[i - 1] > list[i] {
                (list[i], list[i - 1]) = (list[i - 1], list[i])
                done = false
            }
        }
    }
}

क्योंकि स्विफ्ट में बयान आम तौर पर एक लाइन ब्रेक पर समाप्त होते हैं, एक बयान के अंत को चिह्नित करने के लिए अर्धविराम की आवश्यकता कम हो जाती है। अन्य भाषाएं जो अर्धविराम का उपयोग करती हैं वे इस तरह से काम नहीं करती हैं; आप स्वतंत्र रूप से मल्टी-लाइन स्टेटमेंट लिख सकते हैं, लेकिन कंपाइलर को पता है कि स्टेटमेंट समाप्त हो चुका है, जब आप अपने सेमीकॉलन को उसके स्थान पर रखते हैं।

जब स्टेटमेंट एक लाइन ब्रेक पर समाप्त नहीं होता है, तो आपको लाइन ब्रेक को ऐसी जगह पर रखना होगा जिसे स्विफ्ट कंपाइलर पिछली लाइन की निरंतरता के रूप में पहचान सके:

let s2 = str
        .lowercaseString
        .replace("hello", withString: "goodbye")

2
अंतिम कथन गलत है, लाइन ब्रेक लगाने के लिए कोई विशिष्ट स्थान नहीं है। पठनीयता को बेहतर बनाने के लिए अपनी कोड की लाइनों को इंडेंट और एलाइन करना अच्छा है।
एनेको अलोंसो

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