На днях в листе рассылке perl6-users был интересный пример, которым мне бы хотелось с вами поделиться.
Речь идет о том, что возможно объединять в цепочку оператор ... (так называемый sequence operator).
Давайте сначала посмотрим, что значит объединять операторы в цепочку. Два классических примера — сложное условие и оператор редукции.
Условия, содержащие одну и ту же переменную, можно объединять в цепочку, то есть вместо 1 < $x && $x < 10 писать 1 < $x < 10:
my $x = 5; say 'Ok' if 1 < $x < 10; say 'Ok' if 1 < $x && $x < 10;
Оператор редукции позволяет поставить оператор между отдельными элементами списка. Следующие две строки эквивалентны:
say [+] 1, 2, 3; say 1 + 2 + 3;
Возвращаемся к оператору создания последовательности. Вот так он выглядит в обычном случае:
say 1...10; # (1 2 3 4 5 6 7 8 9 10)
Аналогично показанным выше примерам, этот оператор вполне допускает объединение в цепочку и при этом работает как и ожидается:
say 1...5...1; # (1 2 3 4 5 4 3 2 1)
Более того, не обязательно ограничиваться двумя операторами:
say 1...5...1...4...2...5; # (1 2 3 4 5 4 3 2 1 2 3 4 3 2 3 4 5)
Как известно, оператор ... умеет самостоятельно распознавать арифметическую и геометрическую последовательности:
say 1, 2, 4 ... 16; # (1 2 4 8 16)
Это свойство не теряется при объединении в цепочку:
say 1, 2, 4 ... 16, 15 ... 10; # (1 2 4 8 16 15 14 13 12 11 10)
Кастомные правила тоже сохраняют работоспособность:
say 1, 1, * + * ... 13; # (1 1 2 3 5 8 13) say 1, 1, * + * ... 13, 1, * + * ... 44; # (1 1 2 3 5 8 13 1 14 15 29 44)
Йоху.