Как я могу использовать "карту" внутри цикла "для" в Perl 6?

Я пытаюсь использовать map внутри for цикл, но этот код не работает. Этот код должен напечатать 1 а также 2 три раза. Но приведенный ниже код не производит вывода. Это будет работать только частично, если вы раскомментируете exit линия. Есть идеи почему? Я протестировал его, используя текущую версию Perl 6 (версия Rakudo 2015.12-79-g4bb47d5, построенная на версии 2015.12 MoarVM, а также версия Windows).

for (1..3) {
 map { say $_ }, (1..2);
# exit;
}

1 ответ

Решение

Давайте посмотрим на

say (map { say $_ }, 1..2).WHAT;

Это говорит нам &map возвращает Seq, который является ленивой конструкцией.

Кроме того, последнее утверждение в теле for цикл используется для агрегирования его возвращаемого значения, ср

my @list = do for 1..3 {
    map { say $_ }, 1..2;
}

say .WHAT for @list;

Если вы добавите еще одно заявление после вызова &map, вызов будет в "контексте приемника" и будет оценен с нетерпением.

Это также может быть вызвано явно:

for 1..3 {
    sink map { say $_ }, 1..2;
}

В качестве альтернативы, просто используйте другой for цикл:

for 1..3 {
    .say for 1..2;
}
Другие вопросы по тегам