In a message dated Tue, 24 Sep 2002, Chip Salzenberg writes:

> According to Trey Harris:
> > According to Larry,
> >   $a = (1,2,3);
> > is equivalent to
> >   $a = [1,2,3];
> > because they're both equivalent to
> >   $a = scalar(1,2,3)
>
> But that's the bit we're arguing about.  If you allow
>
>    $a = (1,2)
>
> then what about
>
>    $a = (1)
>
> ?  And if someone says that I have to write:
>
>    $a = (1,)
>
> then I am going on the warpath.  That Way Lay Python.

*shrug* Regardless of whether we like it, what Larry said is true unless
and until he invokes Rule 2.  And unless he invokes Rule 2,
C<scalar(1,2,3)> is equivalent to C<[1,2,3]>.

My suggestion is merely that one-tuples lacking the comma cannot be
constructed with parens (round brackets) and that list-flattening context
has the effect of voiding top-level round parens (but not square
brackets).

So

  $a = (7);

would assign 7 to $a, and

  push @a, (7,3,2);

would push the elements 7, 3 and 2 to the end of @a, but

  push @a, [7,3,2];

would push a single element containing the arrayref [7,3,2] onto the end
of @a.

I agree it's weird, but it seems to DWIM, doesn't it?  I just don't think
a reduction that C<()> is equivalent to C<[]> is workable.

If you want to assign $a the value [1], then you write

  $a = [7];

I would think that

  $a = (7,);

would be legal as well, but only in order to handle the DWIM of

  $a = (1,
        2,
        3,
       );

where you kill the middle two lines--not as the preferred (and certainly
not as the only) way to create a one-tuple.  Making

  $a = (7);

create a single-element list is just unworkable.  It requires that
programmers get precedence exactly right, and it badly violates the
principle of least surprise.

Trey

Reply via email to