--- Austin Hastings <[EMAIL PROTECTED]> wrote:
> 
> --- "Adam D. Lopresto" <[EMAIL PROTECTED]> wrote:
> > #Actually, how do we define this?
> > method asBoolean(Complex $self:){
> >     return $self.real || $self.imag;
> > }
> > 
> > 
> > ...
> > 
> > 
> > then somewhere in a function
> > 
> >     return Complex::new(0,0) but true;
> 
> Alternatively, think of the "simple" properties not as C<trait>
> specifications, but as method overrides.
> 
> In this case, we're dynamically modifying the method table for the
> object (i.e., dynamically creating a class) such that a given method
> behaves the way we want:
> 
>   macro true { 
>     "&.asBoolean { return 1; }" 
>   }
> 
>   Complex::new(0,0) but true;
> 
> becomes
> 
>   Complex::new(0,0) but &.asBoolean { return 1; }
> 
> (This is syntactic sugar, not a real macro, because it couldn't
> handle the C<if $complex.true> form. Maybe a better macro 
> programmer?)
> 
> 
> > Since Complex already has an implementation of whatever method
> > decides whether it's true or not, wouldn't just applying a property
> > be insufficient to override that?
> 
> That would be pointless, wouldn't it?

Going further, what's C<true>?

  trait Boolean {
    requires <<&.value>>;
    method true {+(.value) != 0; }
    method false {!?.true}
  }

  trait true
    does Boolean 
  {
    method true { 1; }
    method false { 0; }
  }

  trait true
    does Boolean
  {
    method true { 0; }
    method false { 1; }
  }

Then:

 my $x = 0 but true;

Means
 my [ class $_temp0123 is Scalar does true; ] $x = 0;

Of course, when I do:

  my $x = 0 but (true|false);

then what happens?

=Austin

Reply via email to