class Rational{ // Weenie Rational class, can handle BigInts fcn init(_a,_b){ var a=_a, b=_b; normalize(); } fcn toString{ if(b==1) a.toString() else "%d//%d".fmt(a,b) } var [proxy] isZero=fcn{ a==0 }; fcn normalize{ // divide a and b by gcd g:= a.gcd(b); a/=g; b/=g; if(b<0){ a=-a; b=-b; } // denominator > 0 self } fcn abs { a=a.abs(); self } fcn __opNegate{ a=-a; self } // -Rat fcn __opAdd(n){ if(Rational.isChildOf(n)) self(a*n.b + b*n.a, b*n.b); // Rat + Rat else self(b*n + a, b); // Rat + Int } fcn __opSub(n){ self(a*n.b - b*n.a, b*n.b) } // Rat - Rat fcn __opMul(n){ if(Rational.isChildOf(n)) self(a*n.a, b*n.b); // Rat * Rat else self(a*n, b); // Rat * Int } fcn __opDiv(n){ self(a*n.b,b*n.a) } // Rat / Rat fcn __opEQ(r){ // Rat==Rat, Rat==n if(Rational.isChildOf(r)) a==r.a and b=r.b; else b==1 and a==r; } }