Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

Tags:

raku

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;
}
like image 875
Rodrigo De Almeida Siqueira Avatar asked Jan 10 '16 16:01

Rodrigo De Almeida Siqueira


1 Answers

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;
}
like image 113
Christoph Avatar answered Sep 22 '22 05:09

Christoph