循环变量是否总是新创建的

Whether loop variables are always freshly created

在下面的代码中,我将变量名 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 (int n = 1; n <= 3; n++) 而不是 for (n = 1; n <= 3; n++)(在类 C 语言中)?

(背景)我正在使用 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

Does this mean that the for loop always creates a new loop variable, in a way similar to for (int n = 1; n <= 3; n++) rather than for (n = 1; n <= 3; n++) (in C-like languages)?

是的,没错。 Chapel 的 forforallcoforall 循环分别为其迭代声明新的索引变量。在 forallcoforall 的情况下,这是不必要的,因为不同的任务将执行不同的迭代,并且每个任务都需要自己的索引变量副本。我们的 for 循环采用相同的策略以保持一致性和方便性。如果你想修改 Chapel [co]for[all] 循环中的外部变量,你需要在循环体或迭代器表达式中进行。

编译器可以(也许应该)对像您这样的情况发出警告,在这种情况下,循环变量会遮蔽同一范围内的变量,以避免混淆。如果您想提倡这种行为,请考虑为此提交 GitHub issue