trying to avoid the numeric tower for addition and subtraction
This commit is contained in:
parent
b5bff99169
commit
97dd749a52
|
@ -74,7 +74,11 @@
|
||||||
(assemble-boolean-chain "plt.baselib.numbers.lessThanOrEqual" checked-operands)]
|
(assemble-boolean-chain "plt.baselib.numbers.lessThanOrEqual" checked-operands)]
|
||||||
|
|
||||||
[(=)
|
[(=)
|
||||||
(assemble-boolean-chain "plt.baselib.numbers.equals" checked-operands)]
|
(cond
|
||||||
|
[(< (length operands) MAX-JAVASCRIPT-ARGS-AT-ONCE)
|
||||||
|
(format "RT.checkedNumEquals(M, ~a)" (string-join operands ","))]
|
||||||
|
[else
|
||||||
|
(format "RT.checkedNumEqualsSlowPath(M, [~a])" (string-join operands ","))])]
|
||||||
|
|
||||||
[(>)
|
[(>)
|
||||||
(assemble-boolean-chain "plt.baselib.numbers.greaterThan" checked-operands)]
|
(assemble-boolean-chain "plt.baselib.numbers.greaterThan" checked-operands)]
|
||||||
|
|
|
@ -896,6 +896,39 @@
|
||||||
return sum;
|
return sum;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var checkedNumEquals = function(M) {
|
||||||
|
// Assumption: at least two arguments to compare
|
||||||
|
var i;
|
||||||
|
if (typeof(arguments[1]) !== 'number') {
|
||||||
|
return checkedNumEqualsSlowPath(M, Array.prototype.slice.call(arguments, 1));
|
||||||
|
}
|
||||||
|
var n = arguments[1];
|
||||||
|
for (i = 2; i < arguments.length; i++) {
|
||||||
|
if (typeof(arguments[i] === 'number')) {
|
||||||
|
if (n !== arguments[i]) { return false; }
|
||||||
|
} else {
|
||||||
|
return checkedNumEqualsSlowPath(M, Array.prototype.slice.call(arguments, 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
|
var checkedNumEqualsSlowPath = function(M, args) {
|
||||||
|
var i;
|
||||||
|
if (! isNumber(args[0])) {
|
||||||
|
raiseArgumentTypeError(M, '=', 'number', 0, args[0]);
|
||||||
|
}
|
||||||
|
var n = args[0];
|
||||||
|
for (i = 1; i < args.length; i++) {
|
||||||
|
if (! isNumber(args[i])) {
|
||||||
|
raiseArgumentTypeError(M, '=', 'number', i, args[i]);
|
||||||
|
}
|
||||||
|
if (! plt.baselib.numbers.equals(n, args[i])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
};
|
||||||
|
|
||||||
var checkedCar = function(M, v) {
|
var checkedCar = function(M, v) {
|
||||||
if (isPair(v)) { return v.first; }
|
if (isPair(v)) { return v.first; }
|
||||||
|
@ -1051,6 +1084,8 @@
|
||||||
exports['checkedAddSlowPath'] = checkedAddSlowPath;
|
exports['checkedAddSlowPath'] = checkedAddSlowPath;
|
||||||
exports['checkedSub'] = checkedSub;
|
exports['checkedSub'] = checkedSub;
|
||||||
exports['checkedSubSlowPath'] = checkedSubSlowPath;
|
exports['checkedSubSlowPath'] = checkedSubSlowPath;
|
||||||
|
exports['checkedNumEquals'] = checkedNumEquals;
|
||||||
|
exports['checkedNumEqualsSlowPath'] = checkedNumEqualsSlowPath;
|
||||||
exports['checkedCar'] = checkedCar;
|
exports['checkedCar'] = checkedCar;
|
||||||
exports['checkedCdr'] = checkedCdr;
|
exports['checkedCdr'] = checkedCdr;
|
||||||
}(this.plt, this.plt.baselib));
|
}(this.plt, this.plt.baselib));
|
Loading…
Reference in New Issue
Block a user