निम्नलिखित कोड में, मैं स्थानीय चर और लूप काउंटर दोनों के लिए चर नाम n का उपयोग कर रहा हूं:

proc main()
{
    var n = 700;
    writeln( "n (before loop) = ", n );

    for n in 1..3 {
        writeln( "n = ", n );
    }

    writeln( "n (after loop) = ", n );
}

और परिणाम है

n (before loop) = 700
n = 1
n = 2
n = 3
n (after loop) = 700

क्या इसका मतलब यह है कि for लूप हमेशा for (n = 1; n <= 3; n++) (सी-जैसी भाषाओं में) के बजाय for (int n = 1; n <= 3; n++) के समान एक नया लूप वैरिएबल बनाता है?

(पृष्ठभूमि) मैं ref का उपयोग करके निम्नलिखित कोड के साथ खेल रहा था, और चूंकि लूप ने बाहरी दायरे में baa के मान को नहीं बदला, मैंने कल्पना की कि b शायद एक के रूप में बनाया गया है नया चर...

proc main()
{
    var baa: int = 700;
    ref b = baa;

    writeln( "baa (before loop) = ", baa );

    for b in 1..3 {
        writeln( "b = ", b, " baa = ", baa );
    }

    writeln( "baa (after loop) = ", baa );
}

नतीजा:

baa (before loop) = 700
b = 1 baa = 700
b = 2 baa = 700
b = 3 baa = 700
baa (after loop) = 700
2
roygvib 20 अप्रैल 2018, 22:19

1 उत्तर

सबसे बढ़िया उत्तर

क्या इसका मतलब यह है कि लूप के लिए हमेशा एक नया लूप वैरिएबल बनाता है, एक तरह से for (int n = 1; n <= 3; n++) के बजाय for (n = 1; n <= 3; n++) (सी-जैसी भाषाओं में)?

हाँ यह सही है। चैपल के for, forall, और coforall लूप प्रत्येक अपने पुनरावृत्तियों के लिए नए सूचकांक चर घोषित करते हैं। forall और coforall मामलों में यह आवश्यकता से बाहर किया जाता है क्योंकि अलग-अलग कार्य अलग-अलग पुनरावृत्तियों को निष्पादित करेंगे और प्रत्येक को सूचकांक चर की अपनी प्रति की आवश्यकता होगी। हमारे for लूप निरंतरता और सुविधा के लिए समान रणनीति अपनाते हैं। यदि आप चैपल [co]for[all] लूप के भीतर एक बाहरी चर को संशोधित करना चाहते हैं, तो आपको इसे लूप के बॉडी या इटरेटर एक्सप्रेशन में करना होगा।

कंपाइलर आपके जैसे मामलों के लिए चेतावनी (और शायद चाहिए) उत्सर्जित कर सकता है जिसमें एक लूप वैरिएबल भ्रम से बचने के लिए एक ही दायरे में एक चर छाया करता है। अगर आप इस व्यवहार की वकालत करना चाहते हैं, तो कृपया इसके लिए GitHub समस्या दर्ज करने पर विचार करें यह।

1
Brad 20 अप्रैल 2018, 23:24