В Perl 6 существует оператор, создающий последовательности (sequence operator):
...
Не путайте его с оператором из двух точек для создания диапазонов.
Итак, рассмотрим основные варианты применения оператора из трех точек.
Во-первых, если указать два числа слева и справа, то будет создана последовательность, содержащая все числа в промежутке:
.say for 1...5;
Программа ожидаемым образом печатает числа от одного до пяти. В этом примере тот же эффект был бы достигнут и с помощью диапазона:
.say for 1...5;
Однако, есть несколько отличий. Во-первых, тип созданного объекта:
(1...5).WHAT.say; # (Seq)
(1..5).WHAT.say; # (Range)
Во-вторых, оператор ... умеет самостоятельно формировать данные, если ему показать начало арифметической или геометрической последовательности:
.say for 1, 3 ... 11; # 1 3 5 7 9 11
.say for 1, 2, 4 ... 64; # 1 2 4 8 16 32 64
Если указанный вами последний элемент не окажется в последовательности, он не будет преодолен:
.say for 1, 3 ... 10; # 1 3 5 7 9
Формируемые последовательности могут быть ленивыми, если в качестве границы указана звездочка:
(1...*).is-lazy.say; # True
В таком случае новые элементы генерируются по мере необходимости:
for 1, 2, 4 ... * -> $n {
last if $n > 1000;
say $n;
}
Наконец, вместо начала последовательности можно передать блок кода, вычисляющий следующий элемент. Так вы сможете генерировать любые последовательности, не только арифметические или геометрические:
.say for 1, {$_ * 3} ... 243;
Эта программа печатает числа 1, 3, 9, 27, 81 и 243. Обратите внимание, что при таком подходе верхняя граница должна быть одним из вычисленных элементов последовательности. Если этого не соблюсти и поставить, например, произвольное большое число, то генератор последовательности проскочит его и продолжит бесконечно генерировать числа.
Вместо блока кода удобно воспользоваться звездочкой:
.say for 1, -* ... *; # 1 -1 1 -1 1 -1 1 -1 . . .
Ознакомьтесь также с заметкой «Цепочки последовательностей».