在sink上下文中抛出的块的最后一个元素

jjm*_*elo 6 perl6

这个计划

my @bitfields;
for ^3 -> $i {
    @bitfields[$i] = Bool.pick xx 3;
}

my @total = 0 xx 3;
for @bitfields -> @row {
    @total Z+= @row;
}
say @total;
Run Code Online (Sandbox Code Playgroud)

[0 0 0].如果我们在循环中添加一些东西,无论如何:

my @bitfields;
for ^3 -> $i {
    @bitfields[$i] = Bool.pick xx 3;
}

my @total = 0 xx 3;
for @bitfields -> @row {
    @total Z+= @row;
    say "foo";
}
say @total;
Run Code Online (Sandbox Code Playgroud)

它会正常工作.显然,块的最后一个元素被抛入sink上下文,在这种情况下意味着它被简单地忽略; 这个陷阱与此有关.但是,上面的代码看起来非常好; 还有这个

{@total Z+= @^þ} for @bitfields;
Run Code Online (Sandbox Code Playgroud)

显然是有效的,虽然我没有看到真正的区别.还有其他想法吗?

rai*_*iph 5

对我来说这看起来像个错误.

这看起来非常密切地关联哪个上下文混淆了这个Perl 6 zip运算符?成为Rakudo回购问题用作最后一个用烘焙测试关闭的语句没有下沉forZ+=测试沉没为最后一个语句子调用.

神秘之处在于为什么会出现新的错误.我怀疑是有人需要清理厨房的水槽,也就是说Zoffix 在暗示下沉/ &unwanted助手问题上留下了他的瑕疵.

到目前为止,这是我最好的高尔夫球,以缩小新问题或回归:

my $foo = 'a';
ok:              for 1       { $foo X= 'b' }
notok:           for 1 -> $_ { $foo X= 'c' }
say $foo; # b
halfok: 'd' ~ do for 1 -> $_ { $foo X= 'e' } # Useless use of "~"
say $foo; # e
Run Code Online (Sandbox Code Playgroud)

ok:行有效,因为它省略了->参数.

notok:条线是我问题的高尔夫球.

halfok:行的错误消息是因为它的结果被丢弃.但是,do它迫使编译器评估$foo X= 'e'块中的表达式,因为它应该如此,并且因为它没有notok:在行中.

{@total Z+= @^þ} for @bitfields;
Run Code Online (Sandbox Code Playgroud)

也许那是因为那是非修饰语版本.和/或因为它不使用->语法(这是我的高尔夫上面的回归或新bug的一部分).

或者也许只是运气.我认为Rakudo中的大部分接收器处理代码都是Larry在很久以前的工作,当时他试图让事情大部分正常工作.