खोज…


वाक्य - विन्यास

  • @ भूलो लेबल
  • @ लैबल लेबल

टिप्पणियों

उन्नत नियंत्रण प्रवाह का अति प्रयोग या अनुचित उपयोग कोड को पढ़ने में कठिन बनाता है। @goto या अन्य भाषाओं में इसके समकक्ष, जब अनुचित तरीके से उपयोग किया जाता है, तो अपठनीय स्पेगेटी कोड की ओर जाता है।

सी जैसी भाषाओं के समान, जूलिया में कोई भी कार्य नहीं कर सकता। इसका मतलब यह भी है कि @goto शीर्ष-स्तर पर संभव नहीं है; यह केवल एक फ़ंक्शन के भीतर काम करेगा। इसके अलावा, कोई आंतरिक फ़ंक्शन से अपने बाहरी फ़ंक्शन या किसी बाहरी फ़ंक्शन से आंतरिक फ़ंक्शन तक नहीं जा सकता है।

इनपुट सत्यापन

हालांकि पारंपरिक रूप से छोरों को नहीं माना जाता है, @goto और @label macros का उपयोग अधिक उन्नत नियंत्रण प्रवाह के लिए किया जा सकता है। एक उपयोग मामला तब होता है जब एक भाग की विफलता के कारण पूरे फ़ंक्शन को पुनः प्रयास करना पड़ता है, अक्सर इनपुट सत्यापन में उपयोगी होता है:

function getsequence()
    local a, b

@label start
    print("Input an integer: ")
    try
        a = parse(Int, readline())
    catch
        println("Sorry, that's not an integer.")
        @goto start
    end

    print("Input a decimal: ")
    try
        b = parse(Float64, readline())
    catch
        println("Sorry, that doesn't look numeric.")
        @goto start
    end

    a, b
end

हालाँकि, यह उपयोग मामला अक्सर पुनरावृत्ति का उपयोग करके अधिक स्पष्ट है:

function getsequence()
    local a, b

    print("Input an integer: ")
    try
        a = parse(Int, readline())
    catch
        println("Sorry, that's not an integer.")
        return getsequence()
    end

    print("Input a decimal: ")
    try
        b = parse(Float64, readline())
    catch
        println("Sorry, that doesn't look numeric.")
        return getsequence()
    end

    a, b
end

हालांकि दोनों उदाहरण एक ही काम करते हैं, दूसरा समझना आसान है। हालाँकि, पहले वाला अधिक परफ़ॉर्मेंट है (क्योंकि यह पुनरावर्ती कॉल से बचा जाता है)। ज्यादातर मामलों में, कॉल की लागत से कोई फर्क नहीं पड़ता; लेकिन सीमित स्थितियों में, पहला रूप स्वीकार्य है।

सफाई में त्रुटि

C जैसी भाषाओं में, @goto को अक्सर यह सुनिश्चित करने के लिए उपयोग किया जाता है कि कोई फ़ंक्शन आवश्यक संसाधनों को साफ करता है, यहां तक कि त्रुटि की स्थिति में भी। जूलिया में यह कम महत्वपूर्ण नहीं है, क्योंकि अपवाद और try - finally में अक्सर इसके बजाय ब्लॉक का उपयोग किया जाता है।

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

using Base.Libc
function allocate_some_memory()
    mem1 = malloc(100)
    mem1 == C_NULL && @goto fail
    mem2 = malloc(200)
    mem2 == C_NULL && @goto fail
    mem3 = malloc(300)
    mem3 == C_NULL && @goto fail
    return mem1, mem2, mem3

@label fail
    free(mem1)
    free(mem2)
    free(mem3)
end


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow