Последний элемент блока, брошенный в контекст приемника - PullRequest
0 голосов
/ 31 января 2019

Эта программа

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;

Это будет работать правильно.По-видимому, последний элемент блока выбрасывается в контекст приемника, что в данном случае означает, что он просто игнорируется;эта ловушка связана с этим.Тем не менее, этот код выглядит отлично;и это

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

, очевидно, работает, хотя я не вижу реальной разницы.Любая другая идея?

1 Ответ

0 голосов
/ 01 февраля 2019

Мне это кажется ошибкой.

Это выглядит очень тесно связанным с Какой контекст смущает этот zip-оператор Perl 6? , ставший проблемой репо Rakudo Невозможность утонутьfor когда Z+= используется в качестве последнего оператора , который был закрыт с помощью жареных тестов Проверка потопления для приемников в последнем вызове дополнительных операторов .

Загадка в том, почему существует новая ошибка.Я подозреваю, что кому-то нужно почистить кухонную раковину, то есть взять там, где остановился Зоффикс, с его Недостатками в предполагаемой утечке / &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

Линия ok: работает, потому что она пропускает аргумент ->.

Линия notok: - это мой гольф вашегопроблема.

Сообщение об ошибке для строки halfok: вызвано тем, что ее результат отбрасывается.Но do вынудил компилятор вычислить выражение $foo X= 'e' в блоке, как и должно быть, и как это не удалось в строке notok:.

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

Возможно, это потому, что это немодификатор версии.И / или потому что он не использует синтаксис -> (который является частью регрессии или новой ошибки в моем гольфе выше).

Или, возможно, просто удача.Я думаю, что большая часть кода обработки раковин в Rakudo - это работа Ларри с давних времен, когда он пытался заставить вещи работать в основном правильно.

...