教堂域:"低/高"和"第一/最后"方法之间的差异



Chapel 域有两组方法

domain.low, domain.high

domain.first, domain.last

这些返回不同结果的各种情况是什么(即何时domain.first != domain.lowdomain.last != domain.high

首先,请注意,这些查询不仅在域上受支持,而且在范围(一种更简单的类型,表示许多域及其域查询所基于的整数序列)上也受支持。 出于这个原因,为了简单起见,我的答案最初将侧重于范围,然后再返回到密集矩形域(使用每个维度的范围定义)。

作为背景,对某个范围firstlast旨在指定在该范围进行迭代时将获得的索引。 相反,lowhigh指定定义范围的最小和最大索引。

  • 对于一个简单的范围,如1..10firstlow将是相同的,计算结果为1,而lasthigh的计算结果均为10

  • 在教堂中以相反的顺序迭代范围的方式是使用负步幅,如1..10 by -1. 对于此范围,lowhigh仍将分别110,但first10last1,因为范围表示整数 10、9、8、...、1。

  • 教堂还支持非单位步幅,它们也可能导致差异。 例如,对于范围1..10 by 2lowhigh仍将分别110first仍将1last9,因为此范围仅表示 1 到 10 之间的奇数值。

以下程序演示了这些案例以及我将留给读者的练习1..10 by -2(您也可以在线尝试 (TIO)):

proc printBounds(r) {
writeln("For range ", r, ":");
writeln("  first = ", r.first);
writeln("  last  = ", r.last);
writeln("  low   = ", r.low);
writeln("  high  = ", r.high);
writeln();
}
printBounds(1..10);
printBounds(1..10 by -1);
printBounds(1..10 by 2);
printBounds(1..10 by -2);

密集矩形域是使用每个维度的范围定义的。 此类域上的lowhighfirstlast等查询返回一个值元组,每个维度一个,对应于相应范围的查询结果。 例如,下面是根据上述范围 (TIO) 定义的 4D 域:

const D = {1..10, 1..10 by -1, 1..10 by 2, 1..10 by -2};
writeln("low   = ", D.low);
writeln("high  = ", D.high);
writeln("first = ", D.first);
writeln("last  = ", D.last);

相关内容

  • 没有找到相关文章

最新更新