How can I use “map” inside a “for” loop in Perl 6?

2019-04-24 02:27发布

I'm trying to use map inside a for loop, but this code is not working. This code should print 1 and 2 three times. But the code below produces no output. It will only partially work if you uncomment the exit line. Any idea why? I tested it using the current Perl 6 version (Rakudo version 2015.12-79-g4bb47d5 built on MoarVM version 2015.12 and also the Windows version).

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

标签: perl6
1条回答
聊天终结者
2楼-- · 2019-04-24 03:11

Let's take a look at

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

This tells us &map returns a Seq, which is a lazy construct.

Additionally, the last statement in the body of a for loop is used to aggregate its return value, cf

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

say .WHAT for @list;

If you add another statement after the call to &map, the call will be in 'sink context' and gets evaluated eagerly.

This can also be forced explicitly:

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

Alternatively, just use another for loop:

for 1..3 {
    .say for 1..2;
}
查看更多
登录 后发表回答