Thomas Sandlaà writes:
> Rod Adams wrote:
> >And then internally dispatch on what is defined and undefined.
> 
> Why all that burden if Perl 6 is getting a strong type system,
> that can do the sub selection and compile in dynamic dispatch if
> needed?
> 
> I imagine:
> 
> multi sub cos( Num +$angle ) returns Num where { -1.0 <= $_ <= 1.0 }

Lose the + on $angle.  + indicates a named-only parameter.  You want
this to be positional.

> class Radians is Num
> {
> 
> }
> class Degrees is Num
> {
>     postfix:<Â> ( Num $x ) { return  $x * PI  / 180 }

You probably shouldn't define this inside the Desgrees class.  And you
should probably tell me whether it's a sub, a method, a macro, a
submethod, or a small puppy.

>     multi sub cos( Degrees +$angle ) returns Num where { -1.0 <= $_ <= 1.0 }
>     {
>        return cos( $angle  * PI  / 180 );
>     }

I think that's defining Degrees::cos to be a multi, to be differentiated
from other Degrees::cos'es.  But that may be right.

I'd just make it a method.

    method cos($angle:) returns Num where { -1 <= $_ < 1 } {
        cos($angle * PI / 180);
    }

> }
> 
> Note that cos(30Â) calls &cos<Num> while &cos<Degrees> is used for
> cases like:
> 
> Degrees $angle = 30.0;
> 
> if cos $angle > 2.0 { print "HaloO typechecker!" }

That's certainly an interesting way to do it.

> And I still wonder if the ones without 'Â' on their keyboard could
> directly call 'cos<Degrees> $angle'.

&cos<Degrees>($angle) or Degrees::cos($angle), depending on whether you
defined it your way or my way.  Uh oh, I thought we were going to make
single-invocant multis and methods the same everywhere...

Luke

Reply via email to