लिंक किए गए लेख को निश्चित रूप से डोनाल्ड नुथ के एन + 1/2 लूप्स के बारे में सही मिलता है । C / C ++ / Java में व्यक्त:
for (;;) {
get next element;
if (at the end) break;
process the element;
}
यह किसी फ़ाइल से लाइनों या वर्णों को पढ़ने के लिए उपयोगी है, यदि आप EOF तक पहुँच चुके हैं, और फिर इसे संसाधित कर रहे हैं। मैं पैटर्न को देखने के लिए इतना for(;;)..if(..)break;
अभ्यस्त हूं कि यह मेरे लिए मुहावरा है। (इससे पहले कि मैं नथुना लेख पढ़ चुका था, किताब लिटरेट प्रोग्रामिंग में पुनर्मुद्रित , यह एक "wtf?" हुआ करता था।)
नथ ने कीवर्ड सुझाए loop/while/repeat
:
loop:
S;
while C:
T;
repeat
कहाँ S
और T
शून्य या अधिक बयानों की एक श्रृंखला के लिए जगह धारक हैं, और C
एक बूलियन स्थिति है। यदि कोई S
वक्तव्य नहीं था, तो यह एक लूप लूप होगा, और यदि कोई T
वक्तव्य नहीं था, तो यह एक लूप होगा।
इस निर्माण को शून्य या अधिक while C
क्लॉस की अनुमति देकर खुद को सामान्यीकृत किया जा सकता है , जिससे यह अनंत छोरों को व्यक्त करने के लिए एकदम सही हो जाता है और फिर कुछ दुर्लभ स्थितियों में दो चेक की आवश्यकता होती है।
उसी लेख में, नुथ ने एक सिग्नलिंग तंत्र का सुझाव दिया जो अपवादों को फेंकने / पकड़ने का एक स्थानीय संस्करण होगा (गोटो का उपयोग करने के लिए एक विकल्प के रूप में)।
मेरे लिए? मेरी इच्छा है कि जावा समर्थित टेल-कॉल ऑप्टिमाइज़ेशन, ताकि मैं आवश्यकतानुसार किसी भी सामान्य नियंत्रण संरचना को व्यक्त कर सकूँ ।
अद्यतन: मैं यह उल्लेख करना भूल गया कि कई C / C ++ / Java प्रोग्रामर को इसके आस-पास एक असाइनमेंट का उपयोग करके मिलता है while
:
while ((c = getc(f)) != -1) {
T;
}
नुथ के निर्माण से शब्दों का उपयोग करके, यह स्वीकार्य जब है S
और C
एक भी अभिव्यक्ति में जोड़ा जा सकता। कुछ लोग उपरोक्त असाइनमेंट को देखने के लिए नफरत करते हैं, जबकि अन्य लोग उपरोक्त break
में देखने से नफरत करते हैं for (;;)
। लेकिन जब S
और C
संयुक्त नहीं किया जा सकता है, जैसे कि जब S
कई कथन हैं, तो for (;;)
कोड को दोहराए बिना एकमात्र विकल्प है। अन्य विकल्प केवल S
कोड को डुप्लिकेट करना है :
S;
while (C) {
T;
S;
}
नुथ का loop/while/repeat
विकल्प ज्यादा बेहतर लगता है।