Div, mod handle zero.

This commit is contained in:
sforman 2023-09-23 21:20:37 -07:00
parent f2f1932876
commit 0e380b7748
2 changed files with 554 additions and 168 deletions

View File

@ -6038,6 +6038,84 @@ var $harfangk$elm_bignum$Integer$add = F2(
s1, s1,
A2($harfangk$elm_bignum$Integer$addMagnitudes, m1, m2)); A2($harfangk$elm_bignum$Integer$addMagnitudes, m1, m2));
}); });
var $harfangk$elm_bignum$Integer$abs = function (i) {
if (i.$ === 'Zero') {
return $harfangk$elm_bignum$Integer$Zero;
} else {
if (i.a.$ === 'Positive') {
var _v1 = i.a;
return i;
} else {
var _v2 = i.a;
var m = i.b;
return A2($harfangk$elm_bignum$Integer$Integer, $harfangk$elm_bignum$Integer$Positive, m);
}
}
};
var $harfangk$elm_bignum$Integer$negate = function (i) {
if (i.$ === 'Zero') {
return $harfangk$elm_bignum$Integer$Zero;
} else {
if (i.a.$ === 'Positive') {
var _v1 = i.a;
var m = i.b;
return A2($harfangk$elm_bignum$Integer$Integer, $harfangk$elm_bignum$Integer$Negative, m);
} else {
var _v2 = i.a;
var m = i.b;
return A2($harfangk$elm_bignum$Integer$Integer, $harfangk$elm_bignum$Integer$Positive, m);
}
}
};
var $harfangk$elm_bignum$Integer$adjustSign = F3(
function (dividend, divisor, _v0) {
var q = _v0.a;
var r = _v0.b;
var _v1 = _Utils_Tuple2(dividend, divisor);
_v1$3:
while (true) {
if (_v1.a.$ === 'Integer') {
if (_v1.a.a.$ === 'Positive') {
if ((_v1.b.$ === 'Integer') && (_v1.b.a.$ === 'Negative')) {
var _v2 = _v1.a;
var _v3 = _v2.a;
var _v4 = _v1.b;
var _v5 = _v4.a;
return _Utils_Tuple2(
$harfangk$elm_bignum$Integer$negate(q),
r);
} else {
break _v1$3;
}
} else {
if (_v1.b.$ === 'Integer') {
if (_v1.b.a.$ === 'Positive') {
var _v6 = _v1.a;
var _v7 = _v6.a;
var _v8 = _v1.b;
var _v9 = _v8.a;
return _Utils_Tuple2(
$harfangk$elm_bignum$Integer$negate(q),
$harfangk$elm_bignum$Integer$negate(r));
} else {
var _v10 = _v1.a;
var _v11 = _v10.a;
var _v12 = _v1.b;
var _v13 = _v12.a;
return _Utils_Tuple2(
q,
$harfangk$elm_bignum$Integer$negate(r));
}
} else {
break _v1$3;
}
}
} else {
break _v1$3;
}
}
return _Utils_Tuple2(q, r);
});
var $harfangk$elm_bignum$Integer$reverseOrder = function (o) { var $harfangk$elm_bignum$Integer$reverseOrder = function (o) {
switch (o.$) { switch (o.$) {
case 'GT': case 'GT':
@ -6118,6 +6196,412 @@ var $harfangk$elm_bignum$Integer$compare = F2(
var ord = A2($harfangk$elm_bignum$Integer$compareMag, m1, m2); var ord = A2($harfangk$elm_bignum$Integer$compareMag, m1, m2);
return (_Utils_eq(s1, $harfangk$elm_bignum$Integer$Negative) && _Utils_eq(s2, $harfangk$elm_bignum$Integer$Negative)) ? $harfangk$elm_bignum$Integer$reverseOrder(ord) : ord; return (_Utils_eq(s1, $harfangk$elm_bignum$Integer$Negative) && _Utils_eq(s2, $harfangk$elm_bignum$Integer$Negative)) ? $harfangk$elm_bignum$Integer$reverseOrder(ord) : ord;
}); });
var $elm$core$Basics$abs = function (n) {
return (n < 0) ? (-n) : n;
};
var $harfangk$elm_bignum$Integer$magnitudeFromInt_ = F2(
function (acc, i) {
magnitudeFromInt_:
while (true) {
var q = (i / $harfangk$elm_bignum$Integer$defaultBase) | 0;
if (!q) {
return $elm$core$List$reverse(
A2($elm$core$List$cons, i, acc));
} else {
var $temp$acc = A2($elm$core$List$cons, i % $harfangk$elm_bignum$Integer$defaultBase, acc),
$temp$i = q;
acc = $temp$acc;
i = $temp$i;
continue magnitudeFromInt_;
}
}
});
var $harfangk$elm_bignum$Integer$magnitudeFromInt = $harfangk$elm_bignum$Integer$magnitudeFromInt_(_List_Nil);
var $harfangk$elm_bignum$Integer$fromInt = function (i) {
var _v0 = A2($elm$core$Basics$compare, i, 0);
switch (_v0.$) {
case 'GT':
return A2(
$harfangk$elm_bignum$Integer$Integer,
$harfangk$elm_bignum$Integer$Positive,
$harfangk$elm_bignum$Integer$magnitudeFromInt(i));
case 'EQ':
return $harfangk$elm_bignum$Integer$Zero;
default:
return A2(
$harfangk$elm_bignum$Integer$Integer,
$harfangk$elm_bignum$Integer$Negative,
$harfangk$elm_bignum$Integer$magnitudeFromInt(
$elm$core$Basics$abs(i)));
}
};
var $elm$core$List$append = F2(
function (xs, ys) {
if (!ys.b) {
return xs;
} else {
return A3($elm$core$List$foldr, $elm$core$List$cons, ys, xs);
}
});
var $elm$core$List$repeatHelp = F3(
function (result, n, value) {
repeatHelp:
while (true) {
if (n <= 0) {
return result;
} else {
var $temp$result = A2($elm$core$List$cons, value, result),
$temp$n = n - 1,
$temp$value = value;
result = $temp$result;
n = $temp$n;
value = $temp$value;
continue repeatHelp;
}
}
});
var $elm$core$List$repeat = F2(
function (n, value) {
return A3($elm$core$List$repeatHelp, _List_Nil, n, value);
});
var $elm$core$Tuple$second = function (_v0) {
var y = _v0.b;
return y;
};
var $harfangk$elm_bignum$Integer$addScaleToPartialProducts = function (magList) {
return A3(
$elm$core$List$foldl,
F2(
function (m, _v0) {
var digit = _v0.a;
var acc = _v0.b;
return _Utils_Tuple2(
digit + 1,
A2(
$elm$core$List$cons,
A2(
$elm$core$List$append,
A2($elm$core$List$repeat, digit, 0),
m),
acc));
}),
_Utils_Tuple2(0, _List_Nil),
magList).b;
};
var $harfangk$elm_bignum$Integer$calculatePartialProducts = F2(
function (m1, m2) {
return A2(
$elm$core$List$map,
function (d) {
return A2(
$elm$core$List$map,
$elm$core$Basics$mul(d),
m1);
},
m2);
});
var $harfangk$elm_bignum$Integer$sumPartialProducts = function (magList) {
return A3($elm$core$List$foldl, $harfangk$elm_bignum$Integer$addMagnitudes, _List_Nil, magList);
};
var $harfangk$elm_bignum$Integer$multiplyMagnitudes = F2(
function (m1, m2) {
return $harfangk$elm_bignum$Integer$normalizeMagnitude(
$harfangk$elm_bignum$Integer$sumPartialProducts(
$harfangk$elm_bignum$Integer$addScaleToPartialProducts(
A2($harfangk$elm_bignum$Integer$calculatePartialProducts, m1, m2))));
});
var $harfangk$elm_bignum$Integer$mul = F2(
function (i1, i2) {
var _v0 = _Utils_Tuple2(i1, i2);
if (_v0.a.$ === 'Zero') {
var _v1 = _v0.a;
return $harfangk$elm_bignum$Integer$Zero;
} else {
if (_v0.b.$ === 'Zero') {
var _v2 = _v0.b;
return $harfangk$elm_bignum$Integer$Zero;
} else {
var _v3 = _v0.a;
var s1 = _v3.a;
var m1 = _v3.b;
var _v4 = _v0.b;
var s2 = _v4.a;
var m2 = _v4.b;
var sign = _Utils_eq(s1, s2) ? $harfangk$elm_bignum$Integer$Positive : $harfangk$elm_bignum$Integer$Negative;
var magnitude = function () {
var _v5 = A2(
$elm$core$Basics$compare,
$elm$core$List$length(m1),
$elm$core$List$length(m2));
if (_v5.$ === 'GT') {
return A2($harfangk$elm_bignum$Integer$multiplyMagnitudes, m1, m2);
} else {
return A2($harfangk$elm_bignum$Integer$multiplyMagnitudes, m2, m1);
}
}();
return A2($harfangk$elm_bignum$Integer$Integer, sign, magnitude);
}
}
});
var $harfangk$elm_bignum$Integer$one = A2(
$harfangk$elm_bignum$Integer$Integer,
$harfangk$elm_bignum$Integer$Positive,
_List_fromArray(
[1]));
var $harfangk$elm_bignum$Integer$sub = F2(
function (i1, i2) {
var _v0 = _Utils_Tuple2(i1, i2);
if (_v0.a.$ === 'Zero') {
var _v1 = _v0.a;
return $harfangk$elm_bignum$Integer$negate(i2);
} else {
if (_v0.b.$ === 'Zero') {
var _v2 = _v0.b;
return i1;
} else {
var _v3 = _v0.a;
var s1 = _v3.a;
var m1 = _v3.b;
var _v4 = _v0.b;
var s2 = _v4.a;
var m2 = _v4.b;
return A2(
$harfangk$elm_bignum$Integer$add,
i1,
$harfangk$elm_bignum$Integer$negate(i2));
}
}
});
var $harfangk$elm_bignum$Integer$divmodPartialDividend = F4(
function (dividend, divisor, divExpediter, acc) {
divmodPartialDividend:
while (true) {
var _v0 = A2($harfangk$elm_bignum$Integer$compare, dividend, divisor);
switch (_v0.$) {
case 'LT':
return _Utils_Tuple2(acc, dividend);
case 'EQ':
return _Utils_Tuple2(
A2($harfangk$elm_bignum$Integer$add, acc, $harfangk$elm_bignum$Integer$one),
$harfangk$elm_bignum$Integer$Zero);
default:
var divisorTimesDivExpediter = A2(
$harfangk$elm_bignum$Integer$mul,
divisor,
$harfangk$elm_bignum$Integer$fromInt(divExpediter));
var _v1 = A2($harfangk$elm_bignum$Integer$compare, dividend, divisorTimesDivExpediter);
switch (_v1.$) {
case 'LT':
var $temp$dividend = dividend,
$temp$divisor = divisor,
$temp$divExpediter = (divExpediter / 2) | 0,
$temp$acc = acc;
dividend = $temp$dividend;
divisor = $temp$divisor;
divExpediter = $temp$divExpediter;
acc = $temp$acc;
continue divmodPartialDividend;
case 'EQ':
return _Utils_Tuple2(
A2(
$harfangk$elm_bignum$Integer$add,
acc,
$harfangk$elm_bignum$Integer$fromInt(divExpediter)),
$harfangk$elm_bignum$Integer$Zero);
default:
var dividend_ = A2($harfangk$elm_bignum$Integer$sub, dividend, divisorTimesDivExpediter);
var $temp$dividend = dividend_,
$temp$divisor = divisor,
$temp$divExpediter = divExpediter,
$temp$acc = A2(
$harfangk$elm_bignum$Integer$add,
acc,
$harfangk$elm_bignum$Integer$fromInt(divExpediter));
dividend = $temp$dividend;
divisor = $temp$divisor;
divExpediter = $temp$divExpediter;
acc = $temp$acc;
continue divmodPartialDividend;
}
}
}
});
var $harfangk$elm_bignum$Integer$headAndTail = function (i) {
if (i.$ === 'Zero') {
return _Utils_Tuple2($harfangk$elm_bignum$Integer$Zero, $harfangk$elm_bignum$Integer$Zero);
} else {
var s = i.a;
var m = i.b;
var rM = $elm$core$List$reverse(m);
if (!rM.b) {
return _Utils_Tuple2($harfangk$elm_bignum$Integer$Zero, $harfangk$elm_bignum$Integer$Zero);
} else {
if (!rM.b.b) {
var d = rM.a;
return _Utils_Tuple2(
$harfangk$elm_bignum$Integer$fromInt(d),
$harfangk$elm_bignum$Integer$Zero);
} else {
var d = rM.a;
var ds = rM.b;
return _Utils_Tuple2(
$harfangk$elm_bignum$Integer$fromInt(d),
A2(
$harfangk$elm_bignum$Integer$Integer,
s,
$elm$core$List$reverse(ds)));
}
}
}
};
var $harfangk$elm_bignum$Integer$shiftRightBy = F2(
function (n, i) {
shiftRightBy:
while (true) {
if (i.$ === 'Zero') {
return $harfangk$elm_bignum$Integer$Zero;
} else {
var s = i.a;
var m = i.b;
if (n <= 0) {
return i;
} else {
var $temp$n = n - 1,
$temp$i = A2(
$harfangk$elm_bignum$Integer$Integer,
s,
A2($elm$core$List$cons, 0, m));
n = $temp$n;
i = $temp$i;
continue shiftRightBy;
}
}
}
});
var $harfangk$elm_bignum$Integer$divmod_ = F4(
function (dividend, divisor, qAcc, prevR) {
divmod_:
while (true) {
var _v0 = _Utils_Tuple2(dividend, divisor);
if (_v0.a.$ === 'Zero') {
var _v1 = _v0.a;
return $elm$core$Maybe$Just(
_Utils_Tuple2(qAcc, prevR));
} else {
var _v2 = $harfangk$elm_bignum$Integer$headAndTail(dividend);
var firstDigit = _v2.a;
var remainingDigits = _v2.b;
var currentDividend = A2(
$harfangk$elm_bignum$Integer$add,
firstDigit,
A2($harfangk$elm_bignum$Integer$shiftRightBy, 1, prevR));
var _v3 = A4($harfangk$elm_bignum$Integer$divmodPartialDividend, currentDividend, divisor, $harfangk$elm_bignum$Integer$defaultBase, $harfangk$elm_bignum$Integer$Zero);
var q = _v3.a;
var r = _v3.b;
var qAcc_ = A2(
$harfangk$elm_bignum$Integer$add,
q,
A2($harfangk$elm_bignum$Integer$shiftRightBy, 1, qAcc));
var $temp$dividend = remainingDigits,
$temp$divisor = divisor,
$temp$qAcc = qAcc_,
$temp$prevR = r;
dividend = $temp$dividend;
divisor = $temp$divisor;
qAcc = $temp$qAcc;
prevR = $temp$prevR;
continue divmod_;
}
}
});
var $harfangk$elm_bignum$Integer$divmod = F2(
function (dividend, divisor) {
var _v0 = _Utils_Tuple2(dividend, divisor);
_v0$0:
while (true) {
_v0$4:
while (true) {
if (_v0.b.$ === 'Zero') {
if (_v0.a.$ === 'Zero') {
break _v0$0;
} else {
var _v2 = _v0.b;
return $elm$core$Maybe$Nothing;
}
} else {
if (_v0.a.$ === 'Zero') {
break _v0$0;
} else {
if (_v0.b.a.$ === 'Positive') {
if ((_v0.b.b.b && (_v0.b.b.a === 1)) && (!_v0.b.b.b.b)) {
var _v3 = _v0.b;
var _v4 = _v3.a;
var _v5 = _v3.b;
return $elm$core$Maybe$Just(
_Utils_Tuple2(dividend, $harfangk$elm_bignum$Integer$Zero));
} else {
break _v0$4;
}
} else {
if ((_v0.b.b.b && (_v0.b.b.a === 1)) && (!_v0.b.b.b.b)) {
var _v6 = _v0.b;
var _v7 = _v6.a;
var _v8 = _v6.b;
return $elm$core$Maybe$Just(
_Utils_Tuple2(
$harfangk$elm_bignum$Integer$negate(dividend),
$harfangk$elm_bignum$Integer$Zero));
} else {
break _v0$4;
}
}
}
}
}
var _v9 = _v0.a;
var s1 = _v9.a;
var m1 = _v9.b;
var _v10 = _v0.b;
var s2 = _v10.a;
var m2 = _v10.b;
var _v11 = A2($harfangk$elm_bignum$Integer$compareMag, m1, m2);
switch (_v11.$) {
case 'LT':
return $elm$core$Maybe$Just(
_Utils_Tuple2($harfangk$elm_bignum$Integer$Zero, dividend));
case 'EQ':
var sign = _Utils_eq(s1, s2) ? $harfangk$elm_bignum$Integer$Positive : $harfangk$elm_bignum$Integer$Negative;
return $elm$core$Maybe$Just(
_Utils_Tuple2(
A2(
$harfangk$elm_bignum$Integer$Integer,
sign,
_List_fromArray(
[1])),
$harfangk$elm_bignum$Integer$Zero));
default:
return A2(
$elm$core$Maybe$map,
A2($harfangk$elm_bignum$Integer$adjustSign, dividend, divisor),
A4(
$harfangk$elm_bignum$Integer$divmod_,
$harfangk$elm_bignum$Integer$abs(dividend),
$harfangk$elm_bignum$Integer$abs(divisor),
$harfangk$elm_bignum$Integer$Zero,
$harfangk$elm_bignum$Integer$Zero));
}
}
var _v1 = _v0.a;
return $elm$core$Maybe$Just(
_Utils_Tuple2($harfangk$elm_bignum$Integer$Zero, $harfangk$elm_bignum$Integer$Zero));
});
var $harfangk$elm_bignum$Integer$div = F2(
function (dividend, divisor) {
return A2(
$elm$core$Maybe$map,
$elm$core$Tuple$first,
A2($harfangk$elm_bignum$Integer$divmod, dividend, divisor));
});
var $harfangk$elm_bignum$Integer$eq = F2( var $harfangk$elm_bignum$Integer$eq = F2(
function (i1, i2) { function (i1, i2) {
var _v0 = A2($harfangk$elm_bignum$Integer$compare, i1, i2); var _v0 = A2($harfangk$elm_bignum$Integer$compare, i1, i2);
@ -6148,6 +6632,7 @@ var $harfangk$elm_bignum$Integer$gte = F2(
return false; return false;
} }
}); });
var $author$project$Joy$DivisionByZero = {$: 'DivisionByZero'};
var $elm$core$Result$andThen = F2( var $elm$core$Result$andThen = F2(
function (callback, result) { function (callback, result) {
if (result.$ === 'Ok') { if (result.$ === 'Ok') {
@ -6194,6 +6679,37 @@ var $author$project$Joy$push_int = F2(
$author$project$Joy$JoyInt(i), $author$project$Joy$JoyInt(i),
stack); stack);
}); });
var $author$project$Joy$joy_binary_div_op = F3(
function (op, stack, expression) {
var _v0 = $author$project$Joy$pop_int(stack);
if (_v0.$ === 'Ok') {
var _v1 = _v0.a;
var a = _v1.a;
var s0 = _v1.b;
var _v2 = $author$project$Joy$pop_int(s0);
if (_v2.$ === 'Ok') {
var _v3 = _v2.a;
var b = _v3.a;
var s1 = _v3.b;
var _v4 = A2(op, b, a);
if (_v4.$ === 'Just') {
var n = _v4.a;
return $elm$core$Result$Ok(
_Utils_Tuple2(
A2($author$project$Joy$push_int, n, s1),
expression));
} else {
return $elm$core$Result$Err($author$project$Joy$DivisionByZero);
}
} else {
var msg = _v2.a;
return $elm$core$Result$Err(msg);
}
} else {
var msg = _v0.a;
return $elm$core$Result$Err(msg);
}
});
var $author$project$Joy$joy_binary_math_op = F3( var $author$project$Joy$joy_binary_math_op = F3(
function (op, stack, expression) { function (op, stack, expression) {
var _v0 = $author$project$Joy$pop_int(stack); var _v0 = $author$project$Joy$pop_int(stack);
@ -6681,160 +7197,14 @@ var $harfangk$elm_bignum$Integer$lt = F2(
return false; return false;
} }
}); });
var $elm$core$List$append = F2(
function (xs, ys) {
if (!ys.b) {
return xs;
} else {
return A3($elm$core$List$foldr, $elm$core$List$cons, ys, xs);
}
});
var $elm$core$List$repeatHelp = F3(
function (result, n, value) {
repeatHelp:
while (true) {
if (n <= 0) {
return result;
} else {
var $temp$result = A2($elm$core$List$cons, value, result),
$temp$n = n - 1,
$temp$value = value;
result = $temp$result;
n = $temp$n;
value = $temp$value;
continue repeatHelp;
}
}
});
var $elm$core$List$repeat = F2(
function (n, value) {
return A3($elm$core$List$repeatHelp, _List_Nil, n, value);
});
var $elm$core$Tuple$second = function (_v0) {
var y = _v0.b;
return y;
};
var $harfangk$elm_bignum$Integer$addScaleToPartialProducts = function (magList) {
return A3(
$elm$core$List$foldl,
F2(
function (m, _v0) {
var digit = _v0.a;
var acc = _v0.b;
return _Utils_Tuple2(
digit + 1,
A2(
$elm$core$List$cons,
A2(
$elm$core$List$append,
A2($elm$core$List$repeat, digit, 0),
m),
acc));
}),
_Utils_Tuple2(0, _List_Nil),
magList).b;
};
var $harfangk$elm_bignum$Integer$calculatePartialProducts = F2(
function (m1, m2) {
return A2(
$elm$core$List$map,
function (d) {
return A2(
$elm$core$List$map,
$elm$core$Basics$mul(d),
m1);
},
m2);
});
var $harfangk$elm_bignum$Integer$sumPartialProducts = function (magList) {
return A3($elm$core$List$foldl, $harfangk$elm_bignum$Integer$addMagnitudes, _List_Nil, magList);
};
var $harfangk$elm_bignum$Integer$multiplyMagnitudes = F2(
function (m1, m2) {
return $harfangk$elm_bignum$Integer$normalizeMagnitude(
$harfangk$elm_bignum$Integer$sumPartialProducts(
$harfangk$elm_bignum$Integer$addScaleToPartialProducts(
A2($harfangk$elm_bignum$Integer$calculatePartialProducts, m1, m2))));
});
var $harfangk$elm_bignum$Integer$mul = F2(
function (i1, i2) {
var _v0 = _Utils_Tuple2(i1, i2);
if (_v0.a.$ === 'Zero') {
var _v1 = _v0.a;
return $harfangk$elm_bignum$Integer$Zero;
} else {
if (_v0.b.$ === 'Zero') {
var _v2 = _v0.b;
return $harfangk$elm_bignum$Integer$Zero;
} else {
var _v3 = _v0.a;
var s1 = _v3.a;
var m1 = _v3.b;
var _v4 = _v0.b;
var s2 = _v4.a;
var m2 = _v4.b;
var sign = _Utils_eq(s1, s2) ? $harfangk$elm_bignum$Integer$Positive : $harfangk$elm_bignum$Integer$Negative;
var magnitude = function () {
var _v5 = A2(
$elm$core$Basics$compare,
$elm$core$List$length(m1),
$elm$core$List$length(m2));
if (_v5.$ === 'GT') {
return A2($harfangk$elm_bignum$Integer$multiplyMagnitudes, m1, m2);
} else {
return A2($harfangk$elm_bignum$Integer$multiplyMagnitudes, m2, m1);
}
}();
return A2($harfangk$elm_bignum$Integer$Integer, sign, magnitude);
}
}
});
var $elm$core$Basics$neq = _Utils_notEqual; var $elm$core$Basics$neq = _Utils_notEqual;
var $harfangk$elm_bignum$Integer$negate = function (i) { var $harfangk$elm_bignum$Integer$remainderBy = F2(
if (i.$ === 'Zero') { function (dividend, divisor) {
return $harfangk$elm_bignum$Integer$Zero;
} else {
if (i.a.$ === 'Positive') {
var _v1 = i.a;
var m = i.b;
return A2($harfangk$elm_bignum$Integer$Integer, $harfangk$elm_bignum$Integer$Negative, m);
} else {
var _v2 = i.a;
var m = i.b;
return A2($harfangk$elm_bignum$Integer$Integer, $harfangk$elm_bignum$Integer$Positive, m);
}
}
};
var $harfangk$elm_bignum$Integer$sub = F2(
function (i1, i2) {
var _v0 = _Utils_Tuple2(i1, i2);
if (_v0.a.$ === 'Zero') {
var _v1 = _v0.a;
return $harfangk$elm_bignum$Integer$negate(i2);
} else {
if (_v0.b.$ === 'Zero') {
var _v2 = _v0.b;
return i1;
} else {
var _v3 = _v0.a;
var s1 = _v3.a;
var m1 = _v3.b;
var _v4 = _v0.b;
var s2 = _v4.a;
var m2 = _v4.b;
return A2( return A2(
$harfangk$elm_bignum$Integer$add, $elm$core$Maybe$map,
i1, $elm$core$Tuple$second,
$harfangk$elm_bignum$Integer$negate(i2)); A2($harfangk$elm_bignum$Integer$divmod, dividend, divisor));
}
}
}); });
var $author$project$Joy$swap_args = function (op) {
return F2(
function (a, b) {
return A2(op, b, a);
});
};
var $elm$core$Basics$xor = _Basics_xor; var $elm$core$Basics$xor = _Basics_xor;
var $author$project$Joy$joy_function_eval = F3( var $author$project$Joy$joy_function_eval = F3(
function (symbol, stack, expression) { function (symbol, stack, expression) {
@ -6854,13 +7224,9 @@ var $author$project$Joy$joy_function_eval = F3(
case '*': case '*':
return A3($author$project$Joy$joy_binary_math_op, $harfangk$elm_bignum$Integer$mul, stack, expression); return A3($author$project$Joy$joy_binary_math_op, $harfangk$elm_bignum$Integer$mul, stack, expression);
case '/': case '/':
return A3($author$project$Joy$joy_binary_math_op, $harfangk$elm_bignum$Integer$add, stack, expression); return A3($author$project$Joy$joy_binary_div_op, $harfangk$elm_bignum$Integer$div, stack, expression);
case '%': case '%':
return A3( return A3($author$project$Joy$joy_binary_div_op, $harfangk$elm_bignum$Integer$remainderBy, stack, expression);
$author$project$Joy$joy_binary_math_op,
$author$project$Joy$swap_args($harfangk$elm_bignum$Integer$add),
stack,
expression);
case 'add': case 'add':
return A3($author$project$Joy$joy_binary_math_op, $harfangk$elm_bignum$Integer$add, stack, expression); return A3($author$project$Joy$joy_binary_math_op, $harfangk$elm_bignum$Integer$add, stack, expression);
case 'sub': case 'sub':
@ -6868,13 +7234,9 @@ var $author$project$Joy$joy_function_eval = F3(
case 'mul': case 'mul':
return A3($author$project$Joy$joy_binary_math_op, $harfangk$elm_bignum$Integer$mul, stack, expression); return A3($author$project$Joy$joy_binary_math_op, $harfangk$elm_bignum$Integer$mul, stack, expression);
case 'div': case 'div':
return A3($author$project$Joy$joy_binary_math_op, $harfangk$elm_bignum$Integer$add, stack, expression); return A3($author$project$Joy$joy_binary_div_op, $harfangk$elm_bignum$Integer$div, stack, expression);
case 'mod': case 'mod':
return A3( return A3($author$project$Joy$joy_binary_div_op, $harfangk$elm_bignum$Integer$remainderBy, stack, expression);
$author$project$Joy$joy_binary_math_op,
$author$project$Joy$swap_args($harfangk$elm_bignum$Integer$add),
stack,
expression);
case '<': case '<':
return A3($author$project$Joy$joy_comparison_op, $harfangk$elm_bignum$Integer$lt, stack, expression); return A3($author$project$Joy$joy_comparison_op, $harfangk$elm_bignum$Integer$lt, stack, expression);
case '>': case '>':
@ -7120,6 +7482,8 @@ var $author$project$Joy$joy_err = function (err) {
return 'Empty definition.'; return 'Empty definition.';
case 'DefinitionNameMustBeSymbol': case 'DefinitionNameMustBeSymbol':
return 'Def name isn\'t symbol.'; return 'Def name isn\'t symbol.';
case 'DivisionByZero':
return 'Integer division or modulo by zero.';
case 'CannotTakeFirstOfEmptyList': case 'CannotTakeFirstOfEmptyList':
return 'Cannot take first of empty list.'; return 'Cannot take first of empty list.';
case 'CannotTakeRestOfEmptyList': case 'CannotTakeRestOfEmptyList':

View File

@ -27,6 +27,7 @@ type JoyErr
= UnknownWord = UnknownWord
| EmptyDefinition | EmptyDefinition
| DefinitionNameMustBeSymbol | DefinitionNameMustBeSymbol
| DivisionByZero
| CannotTakeFirstOfEmptyList | CannotTakeFirstOfEmptyList
| CannotTakeRestOfEmptyList | CannotTakeRestOfEmptyList
| CannotBoolify | CannotBoolify
@ -60,6 +61,9 @@ joy_err err =
DefinitionNameMustBeSymbol -> DefinitionNameMustBeSymbol ->
"Def name isn't symbol." "Def name isn't symbol."
DivisionByZero ->
"Integer division or modulo by zero."
CannotTakeFirstOfEmptyList -> CannotTakeFirstOfEmptyList ->
"Cannot take first of empty list." "Cannot take first of empty list."
@ -161,10 +165,10 @@ joy_function_eval symbol stack expression =
joy_binary_math_op (Integer.mul) stack expression joy_binary_math_op (Integer.mul) stack expression
"/" -> "/" ->
joy_binary_math_op (Integer.add) stack expression joy_binary_div_op Integer.div stack expression
"%" -> "%" ->
joy_binary_math_op (swap_args Integer.add) stack expression joy_binary_div_op Integer.remainderBy stack expression
"add" -> "add" ->
joy_binary_math_op (Integer.add) stack expression joy_binary_math_op (Integer.add) stack expression
@ -176,10 +180,10 @@ joy_function_eval symbol stack expression =
joy_binary_math_op (Integer.mul) stack expression joy_binary_math_op (Integer.mul) stack expression
"div" -> "div" ->
joy_binary_math_op (Integer.add) stack expression joy_binary_div_op Integer.div stack expression
"mod" -> "mod" ->
joy_binary_math_op (swap_args Integer.add) stack expression joy_binary_div_op Integer.remainderBy stack expression
"<" -> "<" ->
joy_comparison_op (Integer.lt) stack expression joy_comparison_op (Integer.lt) stack expression
@ -355,6 +359,24 @@ joy_binary_math_op op stack expression =
Err msg Err msg
joy_binary_div_op : (Integer -> Integer -> Maybe Integer) -> JoyFunction
joy_binary_div_op op stack expression =
case pop_int stack of
Ok ( a, s0 ) ->
case pop_int s0 of
Ok ( b, s1 ) ->
case op b a of
Just n ->
Ok ( push_int n s1, expression )
Nothing ->
Err DivisionByZero
Err msg ->
Err msg
Err msg ->
Err msg
swap_args : (Integer -> Integer -> Integer) -> (Integer -> Integer -> Integer) swap_args : (Integer -> Integer -> Integer) -> (Integer -> Integer -> Integer)
swap_args op = swap_args op =
\a b -> op b a \a b -> op b a