Hi, while fixing bugs for the imminent Pugs 6.2.10 release, we ran into several issues with magical pairs (pairs which unexpectedly participate in named binding) again. Based on Luke's "Demagicalizing pairs" thread [1], #perl6 refined the exact semantics [2].
The proposed changes are: * "(key => $value)" (with the parens) is always a positionally passed Pair object. "key => $value" (without the parens) is a named parameter: sub foo ($a) {...} foo(a => 42); # named parameter "a", $a will be 42 foo(:a(42)); # same foo((a => 42)); # positional parameter (a pair), # $a will be the Pair (a => 42) foo((:a(42))); # same * Passing a variable containing a Pair is always passed positionally: my $pair = (a => 42); # or :a(42) foo($pair); # positional parameter, $a will be the Pair (a => 42) * Unary "*" makes a normal pair variable participate in named binding: foo(*$pair); # named parameter "a", $a will be 42 * Same for hashes: my %hash = (a => 1, b => 2, c => 3); foo(%hash); # positional parameter, $a will be \%hash foo(*%hash); # three named parameters Opinions? --Ingo [1] http://article.gmane.org/gmane.comp.lang.perl.perl6.language/4778/ [2] http://colabti.de/irclogger/irclogger_log/perl6?date=2005-10-09,Sun&sel=528#l830