Hi,

(sorry for me going into implementation details, but, as it's really a
language design question, I refrained from sending this to p6c.)


While trying to make the following work in PIL2JS...

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

it occured to me that this is bogus, or at least hard to implement.
Without help from the grammar/macros, this translates to the following
in PIL:

    my ($head, @tail);
    &infix:<,>($head, @tail) = foo();

&infix:<,> is the sub which create lists, e.g. (1,2,3) is really
&infix:<,>(1,2,3). Therefore, &infix:<,> has a signature of ([EMAIL 
PROTECTED]), but
this (of course) causes @tail to be flattened before it reaches
&infix:<,>, causing the statement not to DWIM.

(This corresponds to (@foo, @bar) in Perl-space, which does not evaluate
to a list with two elements, but to a list containing @[EMAIL PROTECTED]
elements (think @foo.append(@bar))).


I see two possible solutions:

1) "Make it work" -- we'll use macros, help from the grammar, or some
   other technique to make it work.

2) We ask people to use the more clear

       my ($head, [EMAIL PROTECTED]) := foo();

   I.e. we use binding's property that the LHS is a subroutine
   signature. (Note that I do not talk about the LHS being a list of
   scalars (e.g. ($a, $b, $c) = foo()), this post only speaks about
   using lists containing @arrays as lvalues).

   If we generally recommend this solution especially to newbies, it
   has got the additional property that

       my ($foo, $bar) := foo();

   will fail if &foo returns more than two things (instead of silently
   discarding any additional arguments, i.e. assuming

       my ($foo, $bar, [EMAIL PROTECTED]) := foo();


Opinions?

-- 
Linux, the choice of a GNU | Row, row, row your bits, gently down the
generation on a dual AMD   | stream...  
Athlon!                    | 

Reply via email to