On Sat, Mar 26, 2005 at 11:57:48PM -0500, Uri Guttman wrote:
: >>>>> "LW" == Larry Wall <[EMAIL PROTECTED]> writes:
: 
:   LW> That being said, in Perl 5, if you say
: 
:   LW>     @a = undef;
: 
:   LW> you don't get an undefined array.  I'd like to make undef smart enough
:   LW> about list contexts that @a actually does end up undefined in Perl 6.
:   LW> That is, in scalar context, undef is a scalar value as in Perl 5, but
:   LW> in Perl 6, undef in list context means "there isn't anything here if
:   LW> you try to look for it", so it's more like () in Perl 5, except that
:   LW> it also undefines the array if it's the only thing in the array.
: 
: then how would you assign undef to the only element of the array? would this
: be needed:
: 
:       @a = ( undef ) ;        # same as p5?
: 
: vs.
:       @a = undef ;            # like undef @a in p5?

Those would do the same thing under the current proposal, since
they're both in list context.  If you really, really want a scalar
undef value in list context, you could always say

    @a = scalar(undef);

: i have always railed against undef on aggregates as it leads to using
: defined on them which is not the same as checking if an aggregate has
: any elements. i see that often in newbie code.

Well, let's not confuse Perl 5's shortcomings with Perl 6's.  I think
we should fix the problem by making undef work a little more like the
newbie expects, which is context dependent.

: in fact i would like to
: stop allowing undef as a function with args and have it only return a
: scalar undef value. there should be a different op to truly make an
: aggregate undefined (and i still don't see a need for that, emptying it
: is all that i ever think is needed).

We could certainly split out a separate undefine() function.  We could
even give it an optional argument that says *why* it's undefined, turning
it into an unthrown exception, basically.  We could use such a function
to create interesting values of undef that are context sensitive.

: in my world undef is a scalar value and nothing else. how do you see it
: in p6?

undef is not a scalar value, it is the explicit *absence* of a value
where you expected one.  In Perl 6, undef is the Bearer of Bad News.

If you merely want undef for a scalar placeholder without negative
connotations, I'd suggest something like

    class Empty {}
    my $nada = new Empty;

instead.  And $nada is the same length as undef.  $X would be even
shorter.

On the other hand, Perl 6 is consistently returning booleans as
0 and 1 rather than "" and 1, so it's likely that constant 0 and 1
can be stored in "less than a bit", as it were.  So there might even
be some kind of zero type that's essentially a value that's always 0,
and takes no room to store at all.  That might serve as a pretty good
neutral placeholder.

Larry

Reply via email to