Hol*_*lli 8 lazy-evaluation rakudo raku
我为本周的挑战编写了这段代码,以生成丑陋的数字。
sub factors( $n ) {
if $n > 1 {
$_, |factors $n div $_
given ( grep $n %% *, 2..* ).first } }
.say for ( 1, |grep *.&factors.all ? ( 2, 3, 5 ), 2..* )[^150];
Run Code Online (Sandbox Code Playgroud)
这是有效的,从某种意义上说,它产生了正确的输出,但它的行为并不懒惰:输出不会立即开始,而是在开始后 30 秒开始。
但是,当我删除索引并遍历裸序列时
.say for 1, |grep *.&factors.all ? ( 2, 3, 5 ), 2..*;
Run Code Online (Sandbox Code Playgroud)
我按预期立即得到输出。
这是一个错误,是吗?
cod*_*ons 10
这不是错误(尽管可能记录得更好)。索引[]具体化了它索引的元素,因此[^150]计算前 150 个元素的(非惰性)列表。(列表的其余部分保持惰性,但那些初始元素不会)。
如果你想懒惰地迭代,你可以&head改用,它会给你以下最后一行:
.say for ( 1, |grep *.&factors.all ? ( 2, 3, 5 ), 2..* ).head(150);
Run Code Online (Sandbox Code Playgroud)