Task

Create a reasonably complete implementation of rational arithmetic in the particular language using the idioms of the language.



Example

Define a new type called frac with binary operator "//" of two integers that returns a structure made up of the numerator and the denominator (as per a rational number).

Further define the appropriate rational unary operators abs and '-', with the binary operators for addition '+', subtraction '-', multiplication '×', division '/', integer division '÷', modulo division, the comparison operators (e.g. '<', '≤', '>', & '≥') and equality operators (e.g. '=' & '≠').

Define standard coercion operators for casting int to frac etc.

If space allows, define standard increment and decrement operators (e.g. '+:=' & '-:=' etc.).

Finally test the operators:
Use the new type frac to find all perfect numbers less than 219 by summing the reciprocal of the factors.



Related task

   Perfect Numbers


a: to :rational [1 2]
b: to :rational [3 4]
 
print ["a:" a]
print ["b:" b]
 
print ["a + b  :" a + b]
print ["a - b  :" a - b]
print ["a * b  :" a * b]
print ["a / b  :" a / b]
print ["a // b :" a // b]
print ["a % b  :" a % b]
 
print ["reciprocal b:" reciprocal b]
print ["neg a:" neg a]
 
print ["pi ~=" to :rational 3.14]