#!/usr/bin/pugs use v6; use Test; plan 18; # L<S03/"Operator renaming" /when applied to a parenthesized list/> { my $arglist = \(1,2,3); # L<S03/"List flattening" /an Array \(or Arglist\)/> my sub foo ($a, $b, $c) { "$a!$b!$c" } is try { foo *$arglist }, "1!2!3", "simply arglist creation with \\( works (1)", :todo<feature>; } { my $arglist = \(1,2,3,<too many args>); # L<S03/"List flattening" /an Array \(or Arglist\)/> my sub foo ($a, $b, $c) { "$a!$b!$c" } dies_ok { foo *$arglist }, "simply arglist creation with \\( works (2)"; } { my $arglist = \(1, named => "arg"); # L<S03/"List flattening" /an Array \(or Arglist\)/> my sub foo ($a, :$named) { "$a!$named" } is try { foo *$arglist }, "1!arg", "simply arglist creation with \\( works (3)", :todo<feature>; } { my $arglist = \(1, (positional => "pair")); # L<S03/"List flattening" /an Array \(or Arglist\)/> my sub foo ($a, $pair) { "$a!$pair" } is try { foo *$arglist }, "1!positional\tpair", "simply arglist creation with \\( works (4)", :todo<feature>; } { my @array = <a b c>; my $arglist = \(@array); # L<S03/"List flattening" /an Array \(or Arglist\)/> my sub foo (@arr) { ~@arr } is try { foo *$arglist }, "a b c", "arglist creation with \\( works"; } # L<S06/"Argument list binding" /single scalar parameter marked/> { my sub bar ($a, $b, $c) { "$a!$b!$c" } my sub foo (\$arglist) { bar *$arglist } is try { foo(1,2,3) }, "1!2!3", "arglist creation with \\$ works (1)", :todo<feature>; dies_ok { foo(1,2,3,4) }, # too many args "arglist creation with \\$ works (2)"; dies_ok { foo(1,2) }, # too few args "arglist creation with \\$ works (3)"; is try { foo(a => 1, b => 2, c => 3) }, "1!2!3", "arglist creation with \\$ works (4)", :todo<feature>; is try { foo(1, b => 2, c => 3) }, "1!2!3", "arglist creation with \\$ works (5)", :todo<feature>; } # Arglists are first-class objects { my $arglist; my sub foo (\$args) { $arglist = $args } lives_ok { foo(1,2,3,4) }, "arglists are first-class objects (1)", :todo<feature>; ok $arglist, "arglists are first-class objects (2)", :todo<feature>; my $old_arglist = $arglist; lives_ok { foo(5,6,7,8) }, "arglists are first-class objects (3)", :todo<feature>; ok $arglist, "arglists are first-class objects (4)", :todo<feature>; ok !($arglist === $old_arglist), "arglists are first-class objects (5)", :todo<feature>; } { my $arglist1; my sub foo ($args) { $arglist1 = $args } my $arglist2 = \(1,2,3); try { foo $arglist2 }; # note: no *$args here cmp_ok $arglist1, &infix:<===>, $arglist2, "unflattened arglists can be passed to subs"; } # Mixing ordinary args with arglists { my $arglist = \(:foo<bar>, :baz<grtz>); my sub foo ($a,$b, :$foo, :$baz) { "$a!$b!$foo!$baz" } dies_ok { foo *$arglist }, # too few args "mixing ordinary args with arglists (1)"; is try { foo 1,2, *$arglist }, "1!2!bar!grtz", "mixing ordinary args with arglists (2)", :todo<feature>; } # XXX sub foo (\@arglist)