Skip to content

Commit

Permalink
Merge pull request #1574 from brownplt/fix-1572
Browse files Browse the repository at this point in the history
Fixes #1572: adds `num-{truncate, floor, ceiling, round, round-even}-{digits, place}` functions
  • Loading branch information
jpolitz committed Feb 15, 2021
2 parents f367b66 + 22e9383 commit 862baff
Show file tree
Hide file tree
Showing 7 changed files with 350 additions and 21 deletions.
16 changes: 13 additions & 3 deletions src/arr/compiler/compile-structs.arr
Expand Up @@ -3070,8 +3070,21 @@ runtime-provides = provides("builtin://global",
"num-max", t-number-binop,
"num-min", t-number-binop,
"num-equal", t-arrow([list: t-number, t-number], t-boolean),
"num-truncate", t-number-unop,
"num-ceiling", t-number-unop,
"num-floor", t-number-unop,
"num-round", t-number-unop,
"num-round-even", t-number-unop,
"num-truncate-digits", t-number-binop,
"num-ceiling-digits", t-number-binop,
"num-floor-digits", t-number-binop,
"num-round-digits", t-number-binop,
"num-round-even-digits", t-number-binop,
"num-truncate-place", t-number-binop,
"num-ceiling-place", t-number-binop,
"num-floor-place", t-number-binop,
"num-round-place", t-number-binop,
"num-round-even-place", t-number-binop,
"num-abs", t-number-unop,
"num-sin", t-number-unop,
"num-cos", t-number-unop,
Expand All @@ -3082,11 +3095,8 @@ runtime-provides = provides("builtin://global",
"num-atan2", t-number-binop,
"num-modulo", t-number-binop,
"num-remainder", t-number-binop,
"num-truncate", t-number-unop,
"num-sqrt", t-number-unop,
"num-sqr", t-number-unop,
"num-ceiling", t-number-unop,
"num-floor", t-number-unop,
"num-log", t-number-unop,
"num-exp", t-number-unop,
"num-exact", t-number-unop,
Expand Down
104 changes: 92 additions & 12 deletions src/js/base/runtime.js
Expand Up @@ -5058,16 +5058,6 @@ function (Namespace, jsnums, codePoint, util, exnStackParser, loader, seedrandom
return thisRuntime.makeNumberBig(jsnums.remainder(n, m, NumberErrbacks));
}

var num_truncate = function(n) {
if (arguments.length !== 1) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-truncate"], 1, $a, false); }
thisRuntime.checkArgsInternal1("Numbers", "num-truncate",
n, thisRuntime.Number);
if (jsnums.greaterThanOrEqual(n, 0, NumberErrbacks)) {
return thisRuntime.makeNumberBig(jsnums.floor(n, NumberErrbacks));
} else {
return thisRuntime.makeNumberBig(jsnums.ceiling(n, NumberErrbacks));
}
}
var num_sqrt = function(n) {
if (arguments.length !== 1) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-sqrt"], 1, $a, false); }
thisRuntime.checkArgsInternal1("Numbers", "num-sqrt",
Expand All @@ -5080,9 +5070,19 @@ function (Namespace, jsnums, codePoint, util, exnStackParser, loader, seedrandom
n, thisRuntime.Number);
return thisRuntime.makeNumberBig(jsnums.sqr(n, NumberErrbacks));
}
var num_truncate = function(n) {
if (arguments.length !== 1) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-truncate"], 1, $a, false); }
thisRuntime.checkArgsInternal1("Numbers", "num-truncate",
n, thisRuntime.Number);
if (jsnums.greaterThanOrEqual(n, 0, NumberErrbacks)) {
return thisRuntime.makeNumberBig(jsnums.floor(n, NumberErrbacks));
} else {
return thisRuntime.makeNumberBig(jsnums.ceiling(n, NumberErrbacks));
}
}
var num_ceiling = function(n) {
if (arguments.length !== 1) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-ceiling"], 1, $a, false); }
thisRuntime.checkArgsInternal1("Numbers", "num-celing",
thisRuntime.checkArgsInternal1("Numbers", "num-ceiling",
n, thisRuntime.Number);
return thisRuntime.makeNumberBig(jsnums.ceiling(n, NumberErrbacks));
}
Expand All @@ -5104,6 +5104,76 @@ function (Namespace, jsnums, codePoint, util, exnStackParser, loader, seedrandom
n, thisRuntime.Number);
return thisRuntime.makeNumberBig(jsnums.roundEven(n, NumberErrbacks));
}
var num_truncate_digits = function(n, digits) {
if (arguments.length !== 2) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-truncate-digits"], 2, $a, false); }
thisRuntime.checkArgsInternal2("Numbers", "num-truncate-digits",
n, thisRuntime.Number, digits, thisRuntime.NumInteger);
var tenDigits = jsnums.expt(10, digits, NumberErrbacks);
return jsnums.divide(num_truncate(jsnums.multiply(n, tenDigits, NumberErrbacks)), tenDigits, NumberErrbacks);
}
var num_ceiling_digits = function(n, digits) {
if (arguments.length !== 2) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-ceiling"], 2, $a, false); }
thisRuntime.checkArgsInternal2("Numbers", "num-ceiling-digits",
n, thisRuntime.Number, digits, thisRuntime.NumInteger);
var tenDigits = jsnums.expt(10, digits, NumberErrbacks);
return jsnums.divide(num_ceiling(jsnums.multiply(n, tenDigits, NumberErrbacks)), tenDigits, NumberErrbacks);
}
var num_floor_digits = function(n, digits) {
if (arguments.length !== 2) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-floor"], 2, $a, false); }
thisRuntime.checkArgsInternal2("Numbers", "num-floor-digits",
n, thisRuntime.Number, digits, thisRuntime.NumInteger);
var tenDigits = jsnums.expt(10, digits, NumberErrbacks);
return jsnums.divide(num_floor(jsnums.multiply(n, tenDigits, NumberErrbacks)), tenDigits, NumberErrbacks);
}
var num_round_digits = function(n, digits) {
if (arguments.length !== 2) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-round"], 2, $a, false); }
thisRuntime.checkArgsInternal2("Numbers", "num-round-digits",
n, thisRuntime.Number, digits, thisRuntime.NumInteger);
var tenDigits = jsnums.expt(10, digits, NumberErrbacks);
return jsnums.divide(num_round(jsnums.multiply(n, tenDigits, NumberErrbacks)), tenDigits, NumberErrbacks);
}
var num_round_even_digits = function(n, digits) {
if (arguments.length !== 2) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-round-even"], 2, $a, false); }
thisRuntime.checkArgsInternal2("Numbers", "num-round-even-digits",
n, thisRuntime.Number, digits, thisRuntime.NumInteger);
var tenDigits = jsnums.expt(10, digits, NumberErrbacks);
return jsnums.divide(num_round_even(jsnums.multiply(n, tenDigits, NumberErrbacks)), tenDigits, NumberErrbacks);
}
var num_truncate_place = function(n, place) {
if (arguments.length !== 2) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-truncate-place"], 2, $a, false); }
thisRuntime.checkArgsInternal2("Numbers", "num-truncate-place",
n, thisRuntime.Number, place, thisRuntime.NumInteger);
var tenPlace = jsnums.expt(10, place, NumberErrbacks);
return jsnums.multiply(num_truncate(jsnums.divide(n, tenPlace, NumberErrbacks)), tenPlace, NumberErrbacks);
}
var num_ceiling_place = function(n, place) {
if (arguments.length !== 2) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-ceiling"], 2, $a, false); }
thisRuntime.checkArgsInternal2("Numbers", "num-ceiling-place",
n, thisRuntime.Number, place, thisRuntime.NumInteger);
var tenPlace = jsnums.expt(10, place, NumberErrbacks);
return jsnums.multiply(num_ceiling(jsnums.divide(n, tenPlace, NumberErrbacks)), tenPlace, NumberErrbacks);
}
var num_floor_place = function(n, place) {
if (arguments.length !== 2) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-floor"], 2, $a, false); }
thisRuntime.checkArgsInternal2("Numbers", "num-floor-place",
n, thisRuntime.Number, place, thisRuntime.NumInteger);
var tenPlace = jsnums.expt(10, place, NumberErrbacks);
return jsnums.multiply(num_floor(jsnums.divide(n, tenPlace, NumberErrbacks)), tenPlace, NumberErrbacks);
}
var num_round_place = function(n, place) {
if (arguments.length !== 2) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-round"], 2, $a, false); }
thisRuntime.checkArgsInternal2("Numbers", "num-round-place",
n, thisRuntime.Number, place, thisRuntime.NumInteger);
var tenPlace = jsnums.expt(10, place, NumberErrbacks);
return jsnums.multiply(num_round(jsnums.divide(n, tenPlace, NumberErrbacks)), tenPlace, NumberErrbacks);
}
var num_round_even_place = function(n, place) {
if (arguments.length !== 2) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-round-even"], 2, $a, false); }
thisRuntime.checkArgsInternal2("Numbers", "num-round-even-place",
n, thisRuntime.Number, place, thisRuntime.NumInteger);
var tenPlace = jsnums.expt(10, place, NumberErrbacks);
return jsnums.multiply(num_round_even(jsnums.divide(n, tenPlace, NumberErrbacks)), tenPlace, NumberErrbacks);
}
var num_log = function(n) {
if (arguments.length !== 1) { var $a=new Array(arguments.length); for (var $i=0;$i<arguments.length;$i++) { $a[$i]=arguments[$i]; } throw thisRuntime.ffi.throwArityErrorC(["num-log"], 1, $a, false); }
thisRuntime.checkArgsInternal1("Numbers", "num-log",
Expand Down Expand Up @@ -5701,13 +5771,23 @@ function (Namespace, jsnums, codePoint, util, exnStackParser, loader, seedrandom
'num-atan2': makeFunction(num_atan2, "num-atan2"),
'num-modulo': makeFunction(num_modulo, "num-modulo"),
'num-remainder': makeFunction(num_remainder, "num-remainder"),
'num-truncate': makeFunction(num_truncate, "num-truncate"),
'num-sqrt': makeFunction(num_sqrt, "num-sqrt"),
'num-sqr': makeFunction(num_sqr, "num-sqr"),
'num-truncate': makeFunction(num_truncate, "num-truncate"),
'num-ceiling': makeFunction(num_ceiling, "num-ceiling"),
'num-floor': makeFunction(num_floor, "num-floor"),
'num-round': makeFunction(num_round, "num-round"),
'num-round-even': makeFunction(num_round_even, "num-round-even"),
'num-truncate-digits': makeFunction(num_truncate_digits, "num-truncate"),
'num-ceiling-digits': makeFunction(num_ceiling_digits, "num-ceiling-digits"),
'num-floor-digits': makeFunction(num_floor_digits, "num-floor-digits"),
'num-round-digits': makeFunction(num_round_digits, "num-round-digits"),
'num-round-even-digits': makeFunction(num_round_even_digits, "num-round-even-digits"),
'num-truncate-place': makeFunction(num_truncate_place, "num-truncate"),
'num-ceiling-place': makeFunction(num_ceiling_place, "num-ceiling-place"),
'num-floor-place': makeFunction(num_floor_place, "num-floor-place"),
'num-round-place': makeFunction(num_round_place, "num-round-place"),
'num-round-even-place': makeFunction(num_round_even_place, "num-round-even-place"),
'num-log': makeFunction(num_log, "num-log"),
'num-exp': makeFunction(num_exp, "num-exp"),
'num-exact': makeFunction(num_exact, "num-exact"),
Expand Down
12 changes: 11 additions & 1 deletion src/js/trove/global-phase0.js
Expand Up @@ -102,13 +102,23 @@
"num-modulo": "NumBinop",
"num-remainder": "NumBinop",

"num-truncate": "NumUnop",
"num-sqrt": "NumUnop",
"num-sqr": "NumUnop",
"num-truncate": "NumUnop",
"num-ceiling": "NumUnop",
"num-floor": "NumUnop",
"num-round": "NumUnop",
"num-round-even": "NumUnop",
"num-truncate-digits": "NumBinop",
"num-ceiling-digits": "NumBinop",
"num-floor-digits": "NumBinop",
"num-round-digits": "NumBinop",
"num-round-even-digits": "NumBinop",
"num-truncate-place": "NumBinop",
"num-ceiling-place": "NumBinop",
"num-floor-place": "NumBinop",
"num-round-place": "NumBinop",
"num-round-even-place": "NumBinop",
"num-log": "NumUnop",
"num-exp": "NumUnop",
"num-exact": "NumUnop",
Expand Down
12 changes: 11 additions & 1 deletion src/js/trove/global-phaseA.js
Expand Up @@ -107,13 +107,23 @@
"num-modulo": "NumBinop",
"num-remainder": "NumBinop",

"num-truncate": "NumUnop",
"num-sqrt": "NumUnop",
"num-sqr": "NumUnop",
"num-truncate": "NumUnop",
"num-ceiling": "NumUnop",
"num-floor": "NumUnop",
"num-round": "NumUnop",
"num-round-even": "NumUnop",
"num-truncate-digits": "NumBinop",
"num-ceiling-digits": "NumBinop",
"num-floor-digits": "NumBinop",
"num-round-digits": "NumBinop",
"num-round-even-digits": "NumBinop",
"num-truncate-place": "NumBinop",
"num-ceiling-place": "NumBinop",
"num-floor-place": "NumBinop",
"num-round-place": "NumBinop",
"num-round-even-place": "NumBinop",
"num-log": "NumUnop",
"num-exp": "NumUnop",
"num-exact": "NumUnop",
Expand Down
16 changes: 13 additions & 3 deletions src/js/trove/global.js
Expand Up @@ -238,19 +238,29 @@
"num-modulo":{'bind': 'fun', 'flatness': 0, 'name': 'num-modulo', 'typ': 'NumBinop'},
"num-remainder":{'bind': 'fun', 'flatness': 0, 'name': 'num-remainder', 'typ': 'NumBinop'},

"num-ceiling":{'bind': 'fun', 'flatness': 0, 'name': 'num-ceiling', 'typ': 'NumUnop'},
"num-exact":{'bind': 'fun', 'flatness': 0, 'name': 'num-exact', 'typ': 'NumUnop'},
"num-exp":{'bind': 'fun', 'flatness': 0, 'name': 'num-exp', 'typ': 'NumUnop'},
"num-floor":{'bind': 'fun', 'flatness': 0, 'name': 'num-floor', 'typ': 'NumUnop'},
"num-log":{'bind': 'fun', 'flatness': 0, 'name': 'num-log', 'typ': 'NumUnop'},
"num-truncate":{'bind': 'fun', 'flatness': 0, 'name': 'num-truncate', 'typ': 'NumUnop'},
"num-floor":{'bind': 'fun', 'flatness': 0, 'name': 'num-floor', 'typ': 'NumUnop'},
"num-ceiling":{'bind': 'fun', 'flatness': 0, 'name': 'num-ceiling', 'typ': 'NumUnop'},
"num-round":{'bind': 'fun', 'flatness': 0, 'name': 'num-round', 'typ': 'NumUnop'},
"num-round-even":{'bind': 'fun', 'flatness': 0, 'name': 'num-round-even', 'typ': 'NumUnop'},
"num-truncate-digits":{'bind': 'fun', 'flatness': 0, 'name': 'num-truncate-digits', 'typ': 'NumBinop'},
"num-floor-digits":{'bind': 'fun', 'flatness': 0, 'name': 'num-floor-digits', 'typ': 'NumBinop'},
"num-ceiling-digits":{'bind': 'fun', 'flatness': 0, 'name': 'num-ceiling-digits', 'typ': 'NumBinop'},
"num-round-digits":{'bind': 'fun', 'flatness': 0, 'name': 'num-round-digits', 'typ': 'NumBinop'},
"num-round-even-digits":{'bind': 'fun', 'flatness': 0, 'name': 'num-round-even-digits', 'typ': 'NumBinop'},
"num-truncate-place":{'bind': 'fun', 'flatness': 0, 'name': 'num-truncate-place', 'typ': 'NumBinop'},
"num-floor-place":{'bind': 'fun', 'flatness': 0, 'name': 'num-floor-place', 'typ': 'NumBinop'},
"num-ceiling-place":{'bind': 'fun', 'flatness': 0, 'name': 'num-ceiling-place', 'typ': 'NumBinop'},
"num-round-place":{'bind': 'fun', 'flatness': 0, 'name': 'num-round-place', 'typ': 'NumBinop'},
"num-round-even-place":{'bind': 'fun', 'flatness': 0, 'name': 'num-round-even-place', 'typ': 'NumBinop'},
"num-sqr":{'bind': 'fun', 'flatness': 0, 'name': 'num-sqr', 'typ': 'NumUnop'},
"num-sqrt":{'bind': 'fun', 'flatness': 0, 'name': 'num-sqrt', 'typ': 'NumUnop'},
"num-to-fixnum":{'bind': 'fun', 'flatness': 0, 'name': 'num-to-fixnum', 'typ': 'NumUnop'},
"num-to-rational":{'bind': 'fun', 'flatness': 0, 'name': 'num-to-rational', 'typ': 'NumUnop'},
"num-to-roughnum":{'bind': 'fun', 'flatness': 0, 'name': 'num-to-roughnum', 'typ': 'NumUnop'},
"num-truncate":{'bind': 'fun', 'flatness': 0, 'name': 'num-truncate', 'typ': 'NumUnop'},

"num-expt":{'bind': 'fun', 'flatness': 0, 'name': 'num-expt', 'typ': 'NumBinop'},
"num-to-string":{'bind': 'fun',
Expand Down
1 change: 1 addition & 0 deletions tests/pyret/main2.arr
@@ -1,6 +1,7 @@
import file("./tests/test-strings.arr") as _
import file("./tests/test-format.arr") as _
import file("./tests/test-numbers.arr") as _
import file("./tests/test-rounding.arr") as _
import file("./tests/test-errors.arr") as _
import file("./tests/test-error-rendering.arr") as _
import file("./tests/test-import.arr") as _
Expand Down

0 comments on commit 862baff

Please sign in to comment.