Austin Hastings writes:
> 
> 
> > -----Original Message-----
> > From: Larry Wall [mailto:[EMAIL PROTECTED]
> > On Thu, Mar 11, 2004 at 06:49:44AM -0800, Gregor N. Purdy wrote:
> > : So, will "mutatingness" be a context we'll be able to inquire on
> > : in the implementation of a called routine?
> >
> > Probably not, but it's vaguely possible you could somehow get a
> > reference to what is being assigned to, if available, and check to see
> > if $dest =:= $src (where =:= tests to see if two refs point to the
> > same object).  But in general I think most "want" testing is just a
> > way of making code run slow, because it forces tests to be done at run
> > time that should be done at compile time or dispatch time.  It's better
> > for the optimizer if you can give it enough type hints and signature
> > hints to decide things earlier than the body of the sub or method.
> >
> > : Or, could we provide a specialized distinct implementation
> > : for mutating that would get called if .=X() is used?
> >
> > That is much more likely.  In general if you don't define both an <op>
> > and an <op>= then Perl can autogenerate or emulate the missing
> > one for you.
> >
> > Now in the specific case of . and .= we don't exactly have a normal
> > binary operator, because the right side is not an expression.
> 
>   $tis.=ÂÂsad pity pity sad sad pity trueÂ;
> 
>   $s .= ($useMbcs ? wlength : length);
> 
> (Side note: although that expression isn't valid, since the wlength
> and length methods aren't qualified, it *should* be, since a human could
> infer it rather easily. 

Well, for a slightly more complex expression, a human would have some
trouble.  This is very likely to be laziness, and we can do without it.
There is certainly a way to do this if it is absolutely necessary:

    my $method = ($useMbcs ?? 'wlength' :: 'length');
    $s.=$method;

> > On the other hand, I'm deeply suspicious of a return signature that
> > mentions a specific variable.  What if the body says to return something
> > else?  Is that just ignored?  Do we check it to see if it's the same
> > item?
> 
> No. You might well say:
> 
>    $string.=length;
> 
> And convert from one subtype to another. I think the mutation indicator
> is a hint to the optimizer, and a crutch for the implementor, in cases
> where it's possible to squeeze more performance out of skipping the
> assignment phase. (In particular, where an inefficient assignment operator
> exists.)

The last thing we need is another idiom that gets destroyed for
"efficiency" reasons.  Once people hear that that is "fast", they'll
start writing:

    $string.=length;

Instead of what they would usually write, the much cleaner:

    my $len = $string.length;

Even though the latter is only 0.05% slower.

Speed has corrupted many programmers.

> 
> Question: Can all this noise be eliminated by paying more attention to
> the construction of the assignment operator?
> 
> That is, do we have an example where $a .= meth is going to perform poorly,
> and that performance is NOT because of the $a = $a.meth assignment? (And
> that cannot be fixed by declaring the invocant 'is rw'.)

The performance issue is never because of the assignment.  Assignment is
basically free: it's just copying a pointer.

It's usually because of the construction.  Constructing a 10,000 element
array's going to be expensive, so you'd rather sort in place.

Luke

Reply via email to