Zipper 如何反向执行zip迭代器?-小教堂

Zipper 如何反向执行zip迭代器?-小教堂,zipper,chapel,Zipper,Chapel,如何以相反的顺序执行zip迭代器?我需要移动子数组的元素 我的代码如下: for (x,y) in zip({c..d by stride},{a..b by stride},){ A1[x]=A1[y]; } 我需要以相反的顺序(即b-->a&d-->c)执行此操作,以避免在区域重叠时覆盖。(a..b总是在c..d之前)。有几点需要指出 首先,在代码示例中,它使用 {c..d by stride} 比如说。{}函数创建了一个域变量,但您只想对它进行迭代。您可以直接在一个范围内迭代,

如何以相反的顺序执行zip迭代器?我需要移动子数组的元素

我的代码如下:

for (x,y) in zip({c..d by stride},{a..b by stride},){
    A1[x]=A1[y];
}

我需要以相反的顺序(即b-->a&d-->c)执行此操作,以避免在区域重叠时覆盖。(a..b总是在c..d之前)。

有几点需要指出

首先,在代码示例中,它使用

{c..d by stride}
比如说。{}函数创建了一个域变量,但您只想对它进行迭代。您可以直接在一个范围内迭代,这在语法上既简单又快速。也就是说,不要写

for i in {1..10} { ... } // unncessary domain
相反,写下这个

for i in 1..10 { ... } // good
现在,回答你的问题。反向迭代一个范围是以负跨步完成的。像这样:

for i in 1..5 by -1 {
  writeln(i);
}
输出

5
4
3
2
1
(5, 50)
(4, 40)
(3, 30)
(2, 20)
(1, 10)
这种反向迭代可以压缩,如下所示:

for (i,j) in zip( 1..5 by -1, 10..50 by -10 ) {
  writeln( (i,j) );
}
输出

5
4
3
2
1
(5, 50)
(4, 40)
(3, 30)
(2, 20)
(1, 10)