在接收器上下文中抛出的块的最后一个元素

时间:2019-01-31 17:59:18

标签: 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;

[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;

它将正常工作。显然,该块的最后一个元素被扔到接收器上下文中,在这种情况下,这意味着它被简单地忽略了。这个trap与此有关。但是,上面的代码看起来很好。还有这个

{@total Z+= @^þ} for @bitfields;

显然有效,尽管我看不出真正的区别。还有其他想法吗?

1 个答案:

答案 0 :(得分:5)

对我来说似乎是个虫子。

这看起来与Which context confuses this Perl 6 zip operator?密切相关,后者成为Rakudo回购问题Failure to sink for when Z+= used as last statement,已通过烘烤测试Test sunk for sinks last statement sub calls 结束。

之谜是为什么有一个新的错误。我的怀疑是有人需要清洁厨房的水槽,例如,在Zoffix因Flaws in implied sinkage / &unwanted helper问题停下来的地方捡拾东西。

到目前为止,这是我迄今为止最好的击球记录,用于缩小新问题或回归范围:

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

ok:行之所以有效,是因为它省略了->参数。

notok:这行是我对您的问题的看法。

halfok:行的错误消息是因为丢弃了它的结果。但是do迫使编译器按原样应该在块中对$foo X= 'e'表达式进行求值,而在notok:行中却失败了。

{@total Z+= @^þ} for @bitfields;

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

或者只是运气。我认为Rakudo中的大多数接收器处理代码都是Larry从很早以前开始的工作,当时他试图使大多数事情正常运行。