我来详细解释一下迭代器的选项:定义一个迭代器可以使你轻松地获取数组语义(感谢 Chapel!)。接下来,我们将使用一些测试用例来扩展上面的代码:
iter arange(type t, start, stop, step=1:t) {
assert(stop > start, "Stop must be greater than start");
assert(step > 0, "Step must be greater than 0");
var x : t = start;
while (x < stop) {
yield x;
x += step;
}
}
iter arange(start:?t, stop:t, step:t=1:t) {
for x in arange(t, start, stop, step) do yield x;
}
iter arange(type t, stop) {
for x in arange(t, 0, stop, 1) do yield x;
}
iter arange(stop:?t) {
for x in arange(t, 0, stop, 1) do yield x;
}
for xi in arange(0.0,1.0,0.1) do writef(" %r",xi);
writef("\n");
for xi in arange(real,0,1,0.1) do writef(" %r",xi);
writef("\n");
var x = arange(real, 0, 1, 0.1);
writeln(x);
var y = sin(2*pi*arange(real, 0, 1, 0.1));
for yi in y do writef(" %.3r",yi);
writef("\n");
writeln(arange(real, 0, 10));
writeln(arange(0.0, 10.0));
运行此代码将会产生:
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
0 0.588 0.951 0.951 0.588 1.22e-16 -0.588 -0.951 -0.951 -0.588 -1.13e-15
0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0
0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0