From bacbd85543965911cdcf221d232559ae07c05c35 Mon Sep 17 00:00:00 2001 From: Bob Nystrom Date: Wed, 30 Sep 2015 08:41:43 -0700 Subject: [PATCH] Add .isInfinity and .isInteger to Num. --- doc/site/core/num.markdown | 16 ++++++++++++++++ src/vm/wren_core.c | 14 ++++++++++++++ test/core/number/is_infinity.wren | 3 +++ test/core/number/is_integer.wren | 11 +++++++++++ 4 files changed, 44 insertions(+) create mode 100644 test/core/number/is_infinity.wren create mode 100644 test/core/number/is_integer.wren diff --git a/doc/site/core/num.markdown b/doc/site/core/num.markdown index 41e058ce..a0bdc375 100644 --- a/doc/site/core/num.markdown +++ b/doc/site/core/num.markdown @@ -60,6 +60,22 @@ Rounds the number down to the nearest integer. 1.5.floor // 1 (-3.2).floor // -4 +### **isInfinity** + +Whether the number is positive or negative infinity or not. + + :::wren + 99999.isInfinity // false + (1/0).isInfinity // true + +### **isInteger** + +Whether the number is an integer or has some fractional component. + + :::wren + 2.isInteger // true + 2.3.isInteger // false + ### **isNan** Whether the number is [not a number](http://en.wikipedia.org/wiki/NaN). This is diff --git a/src/vm/wren_core.c b/src/vm/wren_core.c index ab3f1a30..eb9e3dd7 100644 --- a/src/vm/wren_core.c +++ b/src/vm/wren_core.c @@ -665,6 +665,18 @@ DEF_PRIMITIVE(num_fraction) RETURN_NUM(modf(AS_NUM(args[0]) , &dummy)); } +DEF_PRIMITIVE(num_isInfinity) +{ + RETURN_BOOL(isinf(AS_NUM(args[0]))); +} + +DEF_PRIMITIVE(num_isInteger) +{ + double value = AS_NUM(args[0]); + if (isnan(value) || isinf(value)) RETURN_FALSE; + RETURN_BOOL(trunc(value) == value); +} + DEF_PRIMITIVE(num_isNan) { RETURN_BOOL(isnan(AS_NUM(args[0]))); @@ -1194,6 +1206,8 @@ void wrenInitializeCore(WrenVM* vm) PRIMITIVE(vm->numClass, "...(_)", num_dotDotDot); PRIMITIVE(vm->numClass, "atan(_)", num_atan2); PRIMITIVE(vm->numClass, "fraction", num_fraction); + PRIMITIVE(vm->numClass, "isInfinity", num_isInfinity); + PRIMITIVE(vm->numClass, "isInteger", num_isInteger); PRIMITIVE(vm->numClass, "isNan", num_isNan); PRIMITIVE(vm->numClass, "sign", num_sign); PRIMITIVE(vm->numClass, "toString", num_toString); diff --git a/test/core/number/is_infinity.wren b/test/core/number/is_infinity.wren new file mode 100644 index 00000000..5f503a18 --- /dev/null +++ b/test/core/number/is_infinity.wren @@ -0,0 +1,3 @@ +System.print(123.isInfinity) // expect: false +System.print((1/0).isInfinity) // expect: true +System.print((-10/0).isInfinity) // expect: true diff --git a/test/core/number/is_integer.wren b/test/core/number/is_integer.wren new file mode 100644 index 00000000..0eb76fca --- /dev/null +++ b/test/core/number/is_integer.wren @@ -0,0 +1,11 @@ +System.print(123.isInteger) // expect: true +System.print(123.0.isInteger) // expect: true +System.print(0.isInteger) // expect: true +System.print(1.0000001.isInteger) // expect: false +System.print((-2.3).isInteger) // expect: false + +// NaN is not an integer. +System.print((0/0).isInteger) // expect: false + +// Infinity is not an integer. +System.print((1/0).isInteger) // expect: false