use v6;
use Test;
plan 17;
my ($sub, $got);
$got = '';
$sub = -> $x { $got = "x $x" };
$sub.(123);
is $got, 'x 123', 'pointy sub without param parens';
$got = '';
-> $x { $got = "x $x" }.(123);
is $got, 'x 123', 'called pointy immediately: -> $x { ... }.(...)';
$got = '';
-> $x { $got = "x $x" }(123);
is $got, 'x 123', 'called pointy immediately: -> $x { ... }(...)';
my @a;
lives_ok { @a = ("one", -> $x { $x**2 }, "three")} ,
'pointy sub without preceding comma';
is @a[0], 'one', 'pointy sub in list previous argument';
isa_ok @a[1], Code, 'pointy sub in list';
is @a[2], 'three', 'pointy sub in list following argument';
my $n = 1;
my $s = -> {
last if $n == 10;
$n++;
redo if $n < 10;
};
try { $s.() };
ok(!defined($!), 'pointy with block control exceptions');
is $n, 10, "pointy control exceptions ran";
my $str = '';
sub outer {
my $s = -> {
is(&?ROUTINE.name, '&Main::outer', 'pointy still sees outer\'s &?ROUTINE');
$str ~= 'inner';
return 'inner ret';
};
$s.();
$str ~= 'outer';
return 'outer ret';
}
is outer(), 'inner ret', 'return in pointy returns from enclosing sub';
is $str, 'inner', 'return in pointy returns from enclosing sub';
eval_dies_ok(q{{ -> { $^a, $^b } }}, '-> { $^a, $^b } is illegal');
lives_ok {my $x = -> {}; my $y = $x(); },
'can define and execute empty pointy block';
{
my @a = any(3, 4);
my $ok = 0;
my $iterations = 0;
for @a -> $x {
$ok = 1 if $x ~~ junction;
$iterations++;
}
ok $ok, 'Blocks receive junctions without autothreading';
is $iterations, 1, 'no autothreading happened';
my $b = -> $x { ... };
ok $b.signature.perl !~~ /Any/,
'The .signature of a block does not contain Any';
}