Ingo Blechschmidt wrote:

>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
>
>  
>

What about whitespace?

  foo (a => 42); # Note space

Is that the first case (subcall with named arg) or the second case (sub
with positional pair)?

>* 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
>
>  
>

What's the most complete way to get the sub's arguments?

That is, for a sub that takes positional, optional, named, and variadic
(*) arguments, what's the best mechanism for grabbing the entire call?

Your reply to Uri:

> Uri Guttman wrote:

>> but what about lists and arrays?
>> 
>> my @z = ( 'a', 1 ) ;
>> foo( @z )   # $a = [ 'a', 1 ] ??
>  
>

>  Yep.

Suggests that I cannot pass along parameters in the usual way:

sub foo(...)
{
   bar(@_);
}

Does that work if I code it as

  bar @_;

(which is huffmanly, but hardly intuitive).

=Austin

Reply via email to