From d6b7f0ad9e7a07cdd8295083e1c737a7bf0c6305 Mon Sep 17 00:00:00 2001 From: JamesP Date: Thu, 1 Oct 2015 15:02:46 +1000 Subject: [PATCH 1/3] add assertion for zero denominator --- lib/pure/rationals.nim | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/pure/rationals.nim b/lib/pure/rationals.nim index 60d09c71a..79dc6de16 100644 --- a/lib/pure/rationals.nim +++ b/lib/pure/rationals.nim @@ -20,6 +20,7 @@ type Rational*[T] = object proc initRational*[T](num, den: T): Rational[T] = ## Create a new rational number. + assert(den != 0, "a denominator of zero value is invalid") result.num = num result.den = den From 2f4cc4efce714f036018107f73cf1f5db40cbffd Mon Sep 17 00:00:00 2001 From: JamesP Date: Thu, 1 Oct 2015 15:07:23 +1000 Subject: [PATCH 2/3] add a few type checks to limit type to SomeInteger (adding a compund type to the Rational type definition made it too difficult to define new variables using integer literals) --- lib/pure/rationals.nim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/pure/rationals.nim b/lib/pure/rationals.nim index 79dc6de16..7d9241412 100644 --- a/lib/pure/rationals.nim +++ b/lib/pure/rationals.nim @@ -18,7 +18,7 @@ type Rational*[T] = object ## a rational number, consisting of a numerator and denominator num*, den*: T -proc initRational*[T](num, den: T): Rational[T] = +proc initRational*[T:SomeInteger](num, den: T): Rational[T] = ## Create a new rational number. assert(den != 0, "a denominator of zero value is invalid") result.num = num @@ -34,7 +34,7 @@ proc `$`*[T](x: Rational[T]): string = ## Turn a rational number into a string. result = $x.num & "/" & $x.den -proc toRational*[T](x: T): Rational[T] = +proc toRational*[T:SomeInteger](x: T): Rational[T] = ## Convert some integer `x` to a rational number. result.num = x result.den = 1 @@ -48,7 +48,7 @@ proc toInt*[T](x: Rational[T]): int = ## `x` does not contain an integer value. x.num div x.den -proc reduce*[T](x: var Rational[T]) = +proc reduce*[T:SomeInteger](x: var Rational[T]) = ## Reduce rational `x`. let common = gcd(x.num, x.den) if x.den > 0: From ce18b85d2cfa89a148c9530ac654605475f19a73 Mon Sep 17 00:00:00 2001 From: JamesP Date: Thu, 1 Oct 2015 20:32:49 +1000 Subject: [PATCH 3/3] add two test: zero denominator assert fail, float type compile failure --- tests/rational/trat_float.nim | 9 +++++++++ tests/rational/trat_init.nim | 10 ++++++++++ 2 files changed, 19 insertions(+) create mode 100644 tests/rational/trat_float.nim create mode 100644 tests/rational/trat_init.nim diff --git a/tests/rational/trat_float.nim b/tests/rational/trat_float.nim new file mode 100644 index 000000000..24797c4a0 --- /dev/null +++ b/tests/rational/trat_float.nim @@ -0,0 +1,9 @@ +discard """ + file: "trat_float.nim" + line: "9,19" + errormsg: '''type mismatch: got''' +""" +import rationals +var + # this fails - no floats as num or den + r = initRational(1.0'f, 1.0'f) diff --git a/tests/rational/trat_init.nim b/tests/rational/trat_init.nim new file mode 100644 index 000000000..df29ff6e3 --- /dev/null +++ b/tests/rational/trat_init.nim @@ -0,0 +1,10 @@ +discard """ + file: "trat_init.nim" + exitcode: "1" +""" +import rationals +var + z = Rational[int](num: 0, den: 1) + o = initRational(num=1, den=1) + a = initRational(1, 2) + r = initRational(1, 0) # this fails - no zero denominator