Во-первых, обратите внимание, что эти запросы поддерживаются не только доменами, но и диапазонами (более простой тип, представляющий целочисленную последовательность, на которой основаны многие домены и их доменные запросы). По этой причине вначале мой ответ будет сосредоточен на диапазонах для простоты, прежде чем вернуться к плотным прямоугольным доменам (которые определяются с помощью диапазона для измерения).
В качестве фона first
и last
на диапазон, предназначенные для указания индексов, которые вы получите при повторении этого диапазона. Напротив, low
и high
определяют минимальные и максимальные индексы, определяющие диапазон.
1..10
, first
и low
будут то же самое, оценивая значение 1
, в то время как last
и high
будут оценивать значение 10
1..10 by -1
. Для этого диапазона low
и high
по-прежнему будут 1
и 10
соответственно, но first
будет 10
, а last
будет 1
, так как диапазон представляет целые числа 10, 9 , 8, ..., 1. 1..10 by 2
, low
и high
будут по-прежнему быть 1
и 10
соответственно, а first
по-прежнему будет 1
, но last
будет 9
, так как этот диапазон только представляет нечетные значения от 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);
Плотные прямоугольные домены определяются с использованием диапазона для измерения. Такие запросы, как low
, high
, first
и last
в таких областях, возвращают кортеж значений, по одному на измерение, соответствующий результатам запросов в соответствующих диапазонах. В качестве примера, вот 4D-домен, определенный в терминах диапазонов выше ( TIO ):
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);