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")