这主要是为了了解Raku有多棒。
问题
是否有内置方法可以获取一个列表并无限期地循环遍历它,例如生成惰性列表
a, b, c, a, b, c, ...
出(a, b, c)
?列表文档中的任何内容似乎都没有明显的作用。
可能的解决方案
我至少能想到一对。
更单调的脚踏实地的方法是在惰性范围上进行映射 。在REPL 中:@array[<variable> mod length-of-@array]
0..Inf
perl6
> 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 ...)
一个更酷(我认为)的解决方案是让您首先将您的列表变成一个slip,然后无限期地将重复运算符应用于该 slip:
> 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 ...)
结论
尽管我可以实现这一点(特别是最后一个解决方案非常简洁和令人满意),但我想知道我是否遗漏了专门为此目的而构建的任何东西。
编辑回复:接受的答案
这是为了稍微详细说明@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