Julia Language
@ कट्टो और @ लबेल
खोज…
वाक्य - विन्यास
- @ भूलो लेबल
- @ लैबल लेबल
टिप्पणियों
उन्नत नियंत्रण प्रवाह का अति प्रयोग या अनुचित उपयोग कोड को पढ़ने में कठिन बनाता है। @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