In a message dated 24 Sep 2002, Aaron Sherman writes:
> Grrr... I want that to work, really I do, but since, as Larry has
> pointed out, there's no functional difference between an array ref and
> an array in Perl 6, they would be the same. This is because push is
> almost certainly defined as:
>
> sub push(@target, *@list) { ... }
>
> Regardless of this entire conversation, that problem exists in Perl 6 as
> described in the apocalypses, doesn't it? The way to avoid this is to
> say that array refs behave the same as arrays in every way *except* as
> pertains to list flattening, and in that case, explicit flattening is
> required, otherwise the ref is kept in the flattened array.
>
> Does this make sense?
Yikes. You might be right. 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)
which converts the list to an arrayref. This only tells us about the
behavior of lists in scalar context, though--it says nothing about the
behavior of parens in a list or list-flattening context. Is this key to
push's behavior? Perhaps parens do not construct a list in list context,
but leave whatever is receiving the list and caused the list context to
deal with the elements, i.e., it auto-flattens a paren'ed list if one is
present but not a square-bracketed one?
In that case, we could once again DWIM so that
push @a, 1, 2, 3;
is equivalent to
push @a, (1,2,3);
but not to
push @a, [1,2,3];
I agree, though, that this is getting highly magical. Perhaps
parens-creating-arrayrefs is something that be considered specialized and
arcane and not something that programmers should do, because square
brackets are much more consistent. I know that's a dodge, but maybe
it's the right dodge. :-)
Trey