From 77f506bd709752598db1a4fac7e6293293b9a5a9 Mon Sep 17 00:00:00 2001 From: def Date: Tue, 24 Feb 2015 19:54:27 +0100 Subject: Make Rational an object --- lib/pure/rationals.nim | 67 +++++++++++++++++++++++++++----------------------- 1 file changed, 36 insertions(+), 31 deletions(-) (limited to 'lib/pure/rationals.nim') diff --git a/lib/pure/rationals.nim b/lib/pure/rationals.nim index 3affd3cf3..40c61f1d9 100644 --- a/lib/pure/rationals.nim +++ b/lib/pure/rationals.nim @@ -13,8 +13,14 @@ import math -type Rational*[T] = tuple[num, den: T] +type Rational*[T] = object ## a rational number, consisting of a numerator and denominator + num*, den*: T + +proc initRational*[T](num, den: T): Rational[T] = + ## Create a new rational number. + result.num = num + result.den = den proc toRational*[T](x: SomeInteger): Rational[T] = ## Convert some integer `x` to a rational number. @@ -191,29 +197,29 @@ proc abs*[T](x: Rational[T]): Rational[T] = when isMainModule: var - z = (0, 1) - o = (1, 1) - a = (1, 2) - b = (-1, -2) - m1 = (-1, 1) - tt = (10, 2) + z = Rational[int](num: 0, den: 1) + o = initRational(num=1, den=1) + a = initRational(1, 2) + b = initRational(-1, -2) + m1 = initRational(-1, 1) + tt = initRational(10, 2) assert( a == a ) assert( (a-a) == z ) assert( (a+b) == o ) assert( (a/b) == o ) - assert( (a*b) == (1, 4) ) - assert( (3/a) == (6,1) ) - assert( (a/3) == (1,6) ) - assert( a*b == (1,4) ) + assert( (a*b) == initRational(1, 4) ) + assert( (3/a) == initRational(6,1) ) + assert( (a/3) == initRational(1,6) ) + assert( a*b == initRational(1,4) ) assert( tt*z == z ) assert( 10*a == tt ) assert( a*10 == tt ) assert( tt/10 == a ) - assert( a-m1 == (3, 2) ) - assert( a+m1 == (-1, 2) ) - assert( m1+tt == (16, 4) ) - assert( m1-tt == (6, -1) ) + assert( a-m1 == initRational(3, 2) ) + assert( a+m1 == initRational(-1, 2) ) + assert( m1+tt == initRational(16, 4) ) + assert( m1-tt == initRational(6, -1) ) assert( z < o ) assert( z <= o ) @@ -232,29 +238,28 @@ when isMainModule: assert( not(b > a) ) assert( cmp(a, b) == 0 ) - var x = (1,3) + var x = initRational(1,3) - x *= (5,1) - assert( x == (5,3) ) - x += (2,9) - assert( x == (17,9) ) - x -= (9,18) - assert( x == (25,18) ) - x /= (1,2) - assert( x == (50,18) ) + x *= initRational(5,1) + assert( x == initRational(5,3) ) + x += initRational(2,9) + assert( x == initRational(17,9) ) + x -= initRational(9,18) + assert( x == initRational(25,18) ) + x /= initRational(1,2) + assert( x == initRational(50,18) ) - var y = (1,3) + var y = initRational(1,3) y *= 4 - assert( y == (4,3) ) + assert( y == initRational(4,3) ) y += 5 - assert( y == (19,3) ) + assert( y == initRational(19,3) ) y -= 2 - assert( y == (13,3) ) + assert( y == initRational(13,3) ) y /= 9 - assert( y == (13,27) ) + assert( y == initRational(13,27) ) - assert toRational[int, int](5) == (5,1) + assert toRational[int, int](5) == initRational(5,1) assert abs(toFloat(y) - 0.4814814814814815) < 1.0e-7 assert toInt(z) == 0 - echo 2 + (4,3) -- cgit 1.4.1-2-gfad0