Skip to content

Commit 9a042ea

Browse files
authored
Merge pull request #1458 from brownplt/fix-780
Adding roughly-equals, roughly-equals-{now,always}, roughly-equals-{now,always}3.
2 parents 555c616 + e05f9be commit 9a042ea

File tree

6 files changed

+76
-0
lines changed

6 files changed

+76
-0
lines changed

src/arr/compiler/compile-structs.arr

+5
Original file line numberDiff line numberDiff line change
@@ -3109,6 +3109,11 @@ runtime-provides = provides("builtin://global",
31093109
"equal-always3", t-top,
31103110
"equal-now", t-pred2,
31113111
"equal-now3", t-top,
3112+
"roughly-equal-always", t-pred2,
3113+
"roughly-equal-always3", t-top,
3114+
"roughly-equal-now", t-pred2,
3115+
"roughly-equal-now3", t-top,
3116+
"roughly-equal", t-pred2,
31123117
"identical", t-pred2,
31133118
"identical3", T.t-top,
31143119
"exn-unwrap", T.t-top

src/arr/compiler/type-defaults.arr

+5
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,14 @@ fun make-default-types() block:
137137
default-typs.set-now("makeSrcloc", t-arrow([list: t-srcloc], t-bot))
138138

139139
default-typs.set-now("not", t-arrow([list: t-boolean], t-boolean))
140+
default-typs.set-now("roughly-equal-always", t-arrow([list: t-top, t-top], t-boolean))
141+
default-typs.set-now("roughly-equal-now", t-arrow([list: t-top, t-top], t-boolean))
142+
default-typs.set-now("roughly-equal", t-arrow([list: t-top, t-top], t-boolean))
140143
default-typs.set-now("equal-always", t-arrow([list: t-top, t-top], t-boolean))
141144
default-typs.set-now("equal-now", t-arrow([list: t-top, t-top], t-boolean))
142145
default-typs.set-now("identical", t-arrow([list: t-top, t-top], t-boolean))
146+
default-typs.set-now("roughly-equal-always3", t-arrow([list: t-top, t-top], t-equality-result))
147+
default-typs.set-now("roughly-equal-now3", t-arrow([list: t-top, t-top], t-equality-result))
143148
default-typs.set-now("equal-always3", t-arrow([list: t-top, t-top], t-equality-result))
144149
default-typs.set-now("equal-now3", t-arrow([list: t-top, t-top], t-equality-result))
145150
default-typs.set-now("identical3", t-arrow([list: t-top, t-top], t-equality-result))

src/js/base/runtime.js

+42
Original file line numberDiff line numberDiff line change
@@ -2335,6 +2335,37 @@ function (Namespace, jsnums, codePoint, util, exnStackParser, loader, seedrandom
23352335
}, equalityToBool, "equal-now");
23362336
};
23372337

2338+
const ROUGH_TOL = jsnums.fromFixnum(0.000001, NumberErrbacks);
2339+
// JS function from Pyret values to Pyret equality answers
2340+
function roughlyEqualAlways3(left, right) {
2341+
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(["equal-always3"], 2, $a, false); }
2342+
return equal3(left, right, EQUAL_ALWAYS, ROUGH_TOL, TOL_IS_REL, /*fromWithin?*/false);
2343+
};
2344+
// JS function from Pyret values to Pyret booleans (or throws)
2345+
function roughlyEqualAlways(v1, v2) {
2346+
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(["equal-always"], 2, $a, false); }
2347+
if (((typeof v1 === 'number') && (typeof v2 === 'number')) ||
2348+
((typeof v1 === 'string') && (typeof v2 === 'string')) ||
2349+
((typeof v1 === 'boolean') && (typeof v2 === 'boolean'))) {
2350+
return v1 === v2;
2351+
}
2352+
return safeCall(function() {
2353+
return equal3(v1, v2, EQUAL_ALWAYS, ROUGH_TOL, TOL_IS_REL, /*fromWithin?*/false);
2354+
}, equalityToBool, "roughly-equal-always");
2355+
};
2356+
// JS function from Pyret values to Pyret equality answers
2357+
function roughlyEqualNow3(left, right) {
2358+
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(["equal-now3"], 2, $a, false); }
2359+
return equal3(left, right, EQUAL_NOW, ROUGH_TOL, TOL_IS_REL, /*fromWithin?*/false);
2360+
};
2361+
// JS function from Pyret values to Pyret booleans (or throws)
2362+
function roughlyEqualNow(v1, v2) {
2363+
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(["equal-now"], 2, $a, false); }
2364+
return safeCall(function() {
2365+
return equal3(v1, v2, EQUAL_NOW, ROUGH_TOL, TOL_IS_REL, /*fromWithin?*/false);
2366+
}, equalityToBool, "roughly-equal-now");
2367+
};
2368+
23382369
// JS function from Pyret values to JS booleans
23392370
// Needs to be a worklist algorithm to avoid blowing the stack
23402371
function same(left, right) {
@@ -5717,6 +5748,12 @@ function (Namespace, jsnums, codePoint, util, exnStackParser, loader, seedrandom
57175748
'equal-always3': makeFunction(equalAlways3, "equal-always3"),
57185749
'equal-always': makeFunction(equalAlways, "equal-always"),
57195750

5751+
'roughly-equal': makeFunction(roughlyEqualAlways, "roughly-equal"),
5752+
'roughly-equal-now3': makeFunction(roughlyEqualNow3, "roughly-equal-now3"),
5753+
'roughly-equal-now': makeFunction(roughlyEqualNow, "roughly-equal-now"),
5754+
'roughly-equal-always3': makeFunction(roughlyEqualAlways3, "roughly-equal-always3"),
5755+
'roughly-equal-always': makeFunction(roughlyEqualAlways, "roughly-equal-always"),
5756+
57205757
'within-abs-now3' : makeFunction(equalWithinAbsNow3, "within-abs-now3"),
57215758
'within-rel-now3' : makeFunction(equalWithinRelNow3, "within-rel-now3"),
57225759
'within-abs3' : makeFunction(equalWithinAbs3, "within-abs3"),
@@ -5994,6 +6031,11 @@ function (Namespace, jsnums, codePoint, util, exnStackParser, loader, seedrandom
59946031
'equal_now': equalNow,
59956032
'equal_always3': equalAlways3,
59966033
'equal_always': equalAlways,
6034+
'roughly_equal': roughlyEqualAlways,
6035+
'roughly_equal_now3': roughlyEqualNow3,
6036+
'roughly_equal_now': roughlyEqualNow,
6037+
'roughly_equal_always3': roughlyEqualAlways3,
6038+
'roughly_equal_always': roughlyEqualAlways,
59976039
'combineEquality': combineEquality,
59986040

59996041
'within': equalWithinRel, //?

src/js/trove/global-phaseA.js

+5
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,14 @@
5858

5959
// Equality functions
6060

61+
"roughly-equal-always3": ["arrow", ["Any", "Any"], "Equality"],
62+
"roughly-equal-now3": ["arrow", ["Any", "Any"], "Equality"],
6163
"equal-always3": ["arrow", ["Any", "Any"], "Equality"],
6264
"equal-now3": ["arrow", ["Any", "Any"], "Equality"],
6365
"identical3": ["arrow", ["Any", "Any"], "Equality"],
66+
"roughly-equal-always": "AnyPred2",
67+
"roughly-equal-now": "AnyPred2",
68+
"roughly-equal": "AnyPred2",
6469
"equal-always": "AnyPred2",
6570
"equal-now": "AnyPred2",
6671
"identical": "AnyPred2",

src/js/trove/global.js

+5
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,14 @@
129129

130130
// Equality functions
131131

132+
"roughly-equal-always3": "EqualityPred",
133+
"roughly-equal-now3": "EqualityPred",
132134
"equal-always3": "EqualityPred",
133135
"equal-now3": "EqualityPred",
134136
"identical3": "EqualityPred",
137+
"roughly-equal-always": "AnyPred2",
138+
"roughly-equal-now": "AnyPred2",
139+
"roughly-equal": "AnyPred2",
135140
"equal-always": "AnyPred2",
136141
"equal-now": "AnyPred2",
137142
"identical": "AnyPred2",

tests/pyret/tests/test-equality.arr

+14
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,20 @@ check "numbers":
1010
equal-now(1, 1) is true
1111
equal-now(1, 2) is false
1212
equal-always3(~3, ~3) satisfies E.is-Unknown
13+
roughly-equal(~3, ~3) is true
14+
roughly-equal(~3, ~3.000003) is true
15+
roughly-equal(~3, ~4) is false
16+
roughly-equal(~3, ~3.00004) is false
17+
roughly-equal(3, 3) is true
18+
roughly-equal(3, 3.000003) is true
19+
roughly-equal-now(3, 3.000003) is true
20+
roughly-equal-now(3, 3.000004) is false
21+
roughly-equal-now3(3, 3.000003) satisfies E.is-Equal
22+
roughly-equal-now3(3, 3.000004) satisfies E.is-NotEqual
23+
roughly-equal-always(3, 3.000003) is true
24+
roughly-equal-always(3, 3.000004) is false
25+
roughly-equal-always3(3, 3.000003) satisfies E.is-Equal
26+
roughly-equal-always3(3, 3.000004) satisfies E.is-NotEqual
1327
end
1428

1529
data Nat:

0 commit comments

Comments
 (0)