教堂领域:“低/高”和“第一/最后”方法之间的区别

时间:2018-07-13 19:53:09

标签: chapel

教堂领域有两组方法

domain.low, domain.high

domain.first, domain.last

在哪些情况下它们返回不同的结果(即domain.first != domain.lowdomain.last != domain.high何时?

1 个答案:

答案 0 :(得分:6)

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

作为背景,范围内的firstlast用于指定在该范围内迭代时将获得的索引。相反,lowhigh指定定义范围的最小和最大索引。

  • 对于一个简单范围,例如1..10firstlow将相同,其值为1,而last和{ {1}}都将评估为high

  • 在Chapel中以相反顺序迭代范围的方式是使用10之类的负向步幅。对于此范围,1..10 by -1low仍分别为high1,但是10将分别为first10将是last,因为该范围代表整数10、9、8,...,1。

  • 礼拜堂也支持非单位跨步,它们也可能导致差异。例如,对于范围11..10 by 2low仍分别为high1,而10仍为{{1 }},但first将是1,因为此范围仅表示1到10之间的奇数。

以下程序与last一起演示了这些情况,我将留给读者练习(您也可以try it online (TIO)):

9

使用每个维度的范围定义密集的矩形域。在此类域上,诸如1..10 by -2proc 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); lowhigh之类的查询将返回一个元组值,每个维一个,对应于相应范围内查询的结果。举例来说,以下是根据上述范围(TIO)定义的4D域:

first