Это в основном для того, чтобы узнать, насколько хорош Raku.
Вопрос
Существуют ли встроенные методы, которые будут брать список и бесконечно перебирать его, создавая, скажем, ленивый список?
a, b, c, a, b, c, ...
из (a, b, c)
? Очевидно, что ничто в документации по спискам явно не помогает.
Возможные решения
Я могу вспомнить хотя бы пару.
Более практичным и практичным методом было бы map @array[<variable> mod length-of-@array]
в ленивом диапазоне 0..Inf
. В perl6
REPL:
> my @ar=<a b c>
[a b c]
> (0..Inf).map({ @ar[$_ % @ar.elems] }).[0..100]
(a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a ...)
Более крутое (я думаю) решение - сначала превратить свой список в промах, а затем примените оператор повторения к этому промаху на неопределенный срок:
> my @ar=<a b c>
[a b c]
> (|@ar xx *).[0..100]
(a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a ...)
Заключение
Несмотря на то, что я могу добиться этого (и последнее решение, в частности, очень емкое и удовлетворительное), мне интересно, не хватает ли мне чего-либо, встроенного специально для этой цели.
Изменить Re: принятый ответ
Это нужно для того, чтобы немного уточнить ответ @Brad Gilbert. Оператор «~»
оборачивает конкатенацию строк ~
в « »
гипероператор, который приводит к применению обернутого двоичного оператора к элементам, выбранным последовательно из двух списков.
Итак, чтобы достичь того, что я хотел (цикл списка до желаемой длины, например, 100), можно было бы сделать
<a b c> <<~>> ("" xx 100)
Это производит
(a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a b c a)
(100 записей). Однако у него есть несколько недостатков:
- он переводит записи списка в строки из-за применения
~
- на самом деле он не создает ленивый бесконечный список:
<a b c> <<~>> ("" xx *)
возвращается
List on right side of hyperop of infix:<~> is known to be infinite
in block <unit> at <unknown file> line 1