Haha, that will teach me for trying to golf on public mailing lists.

It should actually read:

    sub int2vec ($n) {
        +<<(sprintf("%b",$n).split('')); # now I'm just golfing :-D
    }

unless you only ever want to use it with the number 7.

-db.

----- Original Message ----
From: David Brunton <[EMAIL PROTECTED]>
To: perl6-users@perl.org
Sent: Thursday, October 5, 2006 4:01:34 PM
Subject: Re: Operator overloading/Inheritance from built-in types?

Hopefully the following will help.  If I've missed the thrust of your
questions, feel free to disregard while someone else improves on my
answer :)  I only overloaded the infix:<+> operator, but it should give
you an idea.

I would write the class comme ça:

use v6-alpha;

class Register {
    has @.reg; # since it's list-ish anyhow
    has $.dec;

    submethod BUILD (:$.dec) {
        @.reg = int2vec( $.dec ); # new() calculates reg
    }

    multi sub *infix:<+> (Register $self, Int $n) {
        return $self.dec + $n;
    }

    sub int2vec ($n) {
        +<<(sprintf("%b",7).split('')); # now I'm just golfing :-D
    }
}

my Register $vec .= new(:dec(7));
say $vec.reg;
say $vec.dec;
say $vec + 2;

I don't think I get much extra credit, but this should give you the
infix operator and the new() behavior you're looking for.

Also, your int2vec is faster.  I just wanted to use sprintf("%b",7) so
I could mention again how I wrote it.

hee hee.

-db.



--- Wim Vanderbauwhede <[EMAIL PROTECTED]> wrote:

> Hi all,
> 
> I want to create a kind of bitvector object. Ideally, I'd like to
> inherit
> from Array and then overload [],=, +,- etc.
> I tried to overload the '+' operator, but I can't get it to work as a
> method. Also, I'd like to overload the assignment operator.
> Is that at all possible?
> Below is my attempt, with the ideal solution and the received errors
> in
> comments.
> 
> Any suggestions?
> 
> Thanks,
> 
> Wim
> 
> ------
> use v6;
> 
> my $vec=Register.new(dec=>7);
> # my $vec=Register.new(7);
> # or even better:
> # my Register $vec=7;
> 
> say $vec.reg;
> # say vec[]; # undefined!
> # new() should calculate reg. But how?
> 
> say $vec.dec;
> # say $vec;
> 
> $vec.write(29);
> # $vec=29;
> 
> say $vec.read(2,4);
> # say $vec[2..4]
> 
> say $vec.read(3);
> # say $vec[3]
> 
> say $vec.add(5);
> # say $vec+=5; # *** Cannot cast from VObject (MkObject {objType =
> (mkType
> "Register") ... to Double (VNum)
> 
> # say $vec + 5; # *** No compatible subroutine found: "&dec"
> 
> #----
> class Register {
>     has $.reg;
>     has $.dec;
> 
>     method write ($self: $n) {
>         $self.dec= $n;
>         $self.reg= int2vec($n);
>     }
> 
>     method read ($self: $i,$j=$i) {
>         return $self.reg[$i..$j];
>     }
> 
>     method add ($n) {
>         $.dec+=$n;
>         $.reg = int2vec($.dec)
>     }
> 
> # This doesn't work: *** Missing invocant parameters in '&infix:+': 0
> received, 1 missing
> #   method infix:<+> ($self: Int $n) {
> #       $self.add($n);
> #   }
> 
>     sub int2vec ($n,$v=[]) {
>         if ($n > 1) {
>             if ($n % 2) {
>                 int2vec(($n-1)/2,[1,@$v]);
>             } else {
>                 int2vec($n/2,[0,@$v]);
>             }
>         } else {
>             return [$n,@$v];
>         }
>     }
> }
> 
> #sub infix:<+> (Register $self, Int $n) {
> #    return $n+$self.dec;
> #}
> 
> #sub infix:<+=> (Register $self, Int $n) {
> #    $self.add($n);
> #}
> 
> -- 
> If it's pointless, what's the point?
> If there is a point to it, what's the point?
> (Tibor Fischer, "The Thought Gang")
> 


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 





Reply via email to