On Sat, Mar 26, 2005 at 03:45:30PM -0500, Chip Salzenberg wrote:
: According to Rod Adams:
: > Chip Salzenberg wrote:
: > >* As far as I can tell, the choice of spelling an array parameter
: > >  C<Array @a> or C<Array $a> is entirely cosmetic: both @a and
: > >  $a are capable of holding an Array reference.  Is there actually
: > >  a difference, e.g. in how they handle an undefined value?
: >
: > Uhm... It was my impression that one of those creates an Array of 
: > Arrays, and the other just an Array.
: 
: Ah, my question had a bug.  What I meant was:
: 
:  * As far as I can tell, the choice of spelling an array parameter
:    C<@a> or C<Array $a> is entirely cosmetic: both @a and $a are
:    capable of holding an Array reference.  Is there actually a
:    difference, e.g. in how they handle an undefined value?

Not really.  The main difference is that @a will flatten in a list
context, and $a won't.

That being said, in Perl 5, if you say

    @a = undef;

you don't get an undefined array.  I'd like to make undef smart enough
about list contexts that @a actually does end up undefined in Perl 6.
That is, in scalar context, undef is a scalar value as in Perl 5, but
in Perl 6, undef in list context means "there isn't anything here if
you try to look for it", so it's more like () in Perl 5, except that
it also undefines the array if it's the only thing in the array.

I don't know if that's an entirely consistent semantics, but I'd rather
have a little inconsistency and preserve error informaiton for later
debugging whenever possible, and that undef you tried to initialize the
array with might have some interesting commentary in it.  (Though, of
course, my example above is a rather boring value of undef.)

Larry

Reply via email to