如何在Raku中无限期地和懒惰地循环浏览列表?

问题描述

主要是为了了解Raku有多棒。

问题

是否有内置方法将获取列表并无限期地循环遍历,例如生成惰性列表

a,b,c,a,...
(a,c)

?列表中的documentation中的任何内容似乎都无法解决问题。

可能的解决方案

我至少可以想到几个。

更扎实的方法是在惰性范围@array[<variable> mod length-of-@array]map 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 ...)

一个更酷的解决方案(我认为)是让您首先将列表变成slip,然后将repetition operator无限期应用于该单据:

> 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的回答的详细说明。 «~»运算符将string concatenation ~包装在« » hyper operator中,这导致将包装的二进制运算符应用于从两个列表中顺序选择的元素。>

因此,要实现我想要的目标(将列表循环到所需的长度,例如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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)