Hi,

Yuval Kogman wrote:
> On Sat, Aug 27, 2005 at 19:16:55 +0200, Ingo Blechschmidt wrote:
> 
>>        my ($head, [EMAIL PROTECTED]) := foo();
> 
> if foo returns a list of scalars >=2 this is like parameter
> unpacking:
> 
> my ($head, [EMAIL PROTECTED]) = *foo();
[...]

Right, but I wanted to drive at the difficulty of making this work,
sorry if I was unclear.


    ($head, [EMAIL PROTECTED]) := foo();  # (Note: := here, not =)

This is not a problem, because :='s LHS is a subroutine signature, which
means the necessary magic is already there.

But there is a problem with the ordinary assignment form:

    ($head, @tail) = foo();

If the LHS is an ordinary list (i.e., if we don't use help from the
grammar/macros), then the @tail would get flattened before it reached
the assignment operator. This is turn would cause the statement not to
DWIM:

    my ($head, @tail) = foo();  # is really

    my ($head, @tail);
    ($head, @tail) = foo();     # is really (as @tail is empty)

    ($head, ())    = foo();     # is really

    ($head)        = foo();     # is really

    $head          = foo();     # !!!

> for this I think we need an easier solution... Perhaps flattenning
> foo instead of adding a slurp, or making yadda yadda in lvalue throw
> it's arguments away silently:
> 
> my ($foo, $bar, ...) := foo();

I like that! :)


--Ingo

-- 
Linux, the choice of a GNU | self-reference, n. - See self-reference  
generation on a dual AMD   | 
Athlon!                    |          

Reply via email to