On Tue, Nov 15, 2005 at 03:43:59PM -0500, John Macdonald wrote:
: On Tue, Nov 15, 2005 at 11:23:49AM -0800, Larry Wall wrote:
: > On Tue, Nov 15, 2005 at 02:11:03PM -0500, Aaron Sherman wrote:
: > : 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.
: > 
: > The situation will probably not arise frequently if we just give people
: > the opportunity to write
: > 
: >     my $a = $b but C | D | E | F;
: > 
: > instead, or whatever our type set notation turns out to be.
: If adding a but involves calling some code to initialize the
: but-iness (I don't know if it does myself), that code might
: inspect or operate on the item that is being modified in a way
: that would be changed if a previous but had not yet been fully
: initialized.  So, the initialization code for each of the buts
: (if any) should be called in order.  Reblessing for each one
: would only matter if the subsequent but code used introspection
: and varied its actions depending on the blessed state.
: The choice between:
:     my $a = $b but C | D | E | F;
: and:
:     my $a = $b but C but D but E but F;
: might be used to control the short-cut initialization (which,
: would have to be an explicit definition rather than an
: optimization since it could have different meaning).

Roles are *supposed* to be well behaved.  If there's a difference
between those two notations, it would be that I'd expect the first to
do the normal compile-time collision checking for all the new roles
at once, while the nested form should do run-time mixins at each
step that potentially hide any previous methods of the same name.
You could have intermediate forms like:

    my $a = $b but C | D but E | F;

where any E or F methods hide any C or D methods, but it detects collisions
between E and F or between C and D.


Reply via email to