On Tue, 2005-11-15 at 12:30, Luke Palmer wrote:
> On 11/15/05, Aaron Sherman <[EMAIL PROTECTED]> wrote:
> > This question came out of a joking comment on IRC, but it's a serious
> > concern. Can chained buts be optimized, or must the compiler strictly
> > create intermediate metaclasses, classes and objects in the following:
> >
> >         my $a = $b but C but D but E but F;
> 
> Certainly.  The semantics should precisely equivalent either way
> (constructors don't get called during a rebless, I think).

So, are you saying that:

        $a = $b but C;

is:

        $a = $b.clone.rebless(class {is $b.meta.class; does C;});

? Or are you refering to does instead of but (which creates a new
object)? If you are saying the former, then would:

        $a = $b but C but D;

be:

        $a = $b.clone.rebless(class {is $b.meta.class; does C; does D});

or:

        {
                my $_tmp = $b.clone.rebless(class {is $b.meta.class; does C;});
                $a = $_tmp.clone.rebless(class {is $_tmp.meta.class; does D;});
        }

?

This is where the semantic difference arises, since the constructor
and/or destructor for $b.meta.class might well be something that I
expected to be called multiple times, and won't see.

All of that is fine, as far as I'm concerned, as long as we give the
user the proviso that chained buts might be optimized down into a single
cloning operation or not at the compiler's whim, but it could be a nasty
shock if it's not documented, and it's a rather ugly amount of overhead
if we don't allow for the optimization.

-- 
Aaron Sherman <[EMAIL PROTECTED]>
Senior Systems Engineer and Toolsmith
"It's the sound of a satellite saying, 'get me down!'" -Shriekback


Reply via email to