4__IDRRT__.Type = function(type) {
8__IDRRT__.Int = new __IDRRT__.Type('Int');
9__IDRRT__.Char = new __IDRRT__.Type('Char');
10__IDRRT__.String = new __IDRRT__.Type('String');
11__IDRRT__.Integer = new __IDRRT__.Type('Integer');
12__IDRRT__.Float = new __IDRRT__.Type('Float');
13__IDRRT__.Forgot = new __IDRRT__.Type('Forgot');
16__IDRRT__.Tailcall = function(f) { this.f = f };
19__IDRRT__.Con = function(i,vars) {
24__IDRRT__.tailcall = function(f) {
32 if (ret instanceof __IDRRT__.Tailcall) {
41 BigInteger Javascript code taken from:
42 https://github.com/peterolson
44__IDRRT__.bigInt = (function () {
45 var base = 10000000, logBase = 7;
51 var normalize = function (first, second) {
52 var a = first.value, b = second.value;
53 var length = a.length > b.length ? a.length : b.length;
54 for (var i = 0; i < length; i++) {
58 for (var i = length - 1; i >= 0; i--) {
59 if (a[i] === 0 && b[i] === 0) {
64 if (!a.length) a = [0], b = [0];
69 var parse = function (text, first) {
70 if (typeof text === "object") return text;
72 var s = sign.positive, value = [];
73 if (text[0] === "-") {
77 var text = text.split("e");
78 if (text.length > 2) throw new Error("Invalid integer");
81 if (exp[0] === "+") exp = exp.slice(1);
83 if (exp.lesser(0)) throw new Error("Cannot include negative exponent part for integers");
84 while (exp.notEquals(0)) {
90 if (text === "-0") text = "0";
91 var isValid = /^([0-9][0-9]*)$/.test(text);
92 if (!isValid) throw new Error("Invalid integer");
94 var divider = text.length > logBase ? text.length - logBase : 0;
95 value.push(+text.slice(divider));
96 text = text.slice(0, divider);
98 var val = bigInt(value, s);
99 if (first) normalize(first, val);
103 var goesInto = function (a, b) {
104 var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive);
105 if (a.equals(0)) throw new Error("Cannot divide by 0");
109 var c = bigInt(a.value, sign.positive), t = c.times(10);
110 while (t.lesser(b)) {
115 while (c.lesserOrEquals(b)) {
119 } while (a.lesserOrEquals(b));
127 var bigInt = function (value, s) {
135 negate: function (m) {
136 var first = m || self;
137 return bigInt(first.value, !first.sign);
140 var first = m || self;
141 return bigInt(first.value, sign.positive);
143 add: function (n, m) {
144 var s, first = self, second;
145 if (m) (first = parse(n)) && (second = parse(m));
146 else second = parse(n, first);
148 if (first.sign !== second.sign) {
149 first = bigInt(first.value, sign.positive);
150 second = bigInt(second.value, sign.positive);
151 return s === sign.positive ?
152 o.subtract(first, second) :
153 o.subtract(second, first);
155 normalize(first, second);
156 var a = first.value, b = second.value;
159 for (var i = 0; i < a.length || carry > 0; i++) {
160 var sum = (a[i] || 0) + (b[i] || 0) + carry;
161 carry = sum >= base ? 1 : 0;
165 return bigInt(result, s);
167 plus: function (n, m) {
170 subtract: function (n, m) {
171 var first = self, second;
172 if (m) (first = parse(n)) && (second = parse(m));
173 else second = parse(n, first);
174 if (first.sign !== second.sign) return o.add(first, o.negate(second));
175 if (first.sign === sign.negative) return o.subtract(o.negate(second), o.negate(first));
176 if (o.compare(first, second) === -1) return o.negate(o.subtract(second, first));
177 var a = first.value, b = second.value;
180 for (var i = 0; i < a.length; i++) {
182 borrow = a[i] < b[i] ? 1 : 0;
183 var minuend = (borrow * base) + a[i] - b[i];
184 result.push(minuend);
186 return bigInt(result, sign.positive);
188 minus: function (n, m) {
189 return o.subtract(n, m);
191 multiply: function (n, m) {
192 var s, first = self, second;
193 if (m) (first = parse(n)) && (second = parse(m));
194 else second = parse(n, first);
195 s = first.sign !== second.sign;
196 var a = first.value, b = second.value;
198 for (var i = 0; i < a.length; i++) {
202 resultSum[i].push(0);
206 for (var i = 0; i < a.length; i++) {
208 for (var j = 0; j < b.length || carry > 0; j++) {
210 var product = y ? (x * y) + carry : carry;
211 carry = product > base ? Math.floor(product / base) : 0;
212 product -= carry * base;
213 resultSum[i].push(product);
217 for (var i = 0; i < resultSum.length; i++) {
218 var len = resultSum[i].length;
219 if (len > max) max = len;
221 var result = [], carry = 0;
222 for (var i = 0; i < max || carry > 0; i++) {
224 for (var j = 0; j < resultSum.length; j++) {
225 sum += resultSum[j][i] || 0;
227 carry = sum > base ? Math.floor(sum / base) : 0;
231 return bigInt(result, s);
233 times: function (n, m) {
234 return o.multiply(n, m);
236 divmod: function (n, m) {
237 var s, first = self, second;
238 if (m) (first = parse(n)) && (second = parse(m));
239 else second = parse(n, first);
240 s = first.sign !== second.sign;
241 if (bigInt(first.value, first.sign).equals(0)) return {
242 quotient: bigInt([0], sign.positive),
243 remainder: bigInt([0], sign.positive)
245 if (second.equals(0)) throw new Error("Cannot divide by zero");
246 var a = first.value, b = second.value;
247 var result = [], remainder = [];
248 for (var i = a.length - 1; i >= 0; i--) {
249 var n = [a[i]].concat(remainder);
250 var quotient = goesInto(b, n);
251 result.push(quotient.result);
252 remainder = quotient.remainder;
256 quotient: bigInt(result, s),
257 remainder: bigInt(remainder, first.sign)
260 divide: function (n, m) {
261 return o.divmod(n, m).quotient;
263 over: function (n, m) {
264 return o.divide(n, m);
266 mod: function (n, m) {
267 return o.divmod(n, m).remainder;
269 pow: function (n, m) {
270 var first = self, second;
271 if (m) (first = parse(n)) && (second = parse(m));
272 else second = parse(n, first);
273 var a = first, b = second;
274 if (b.lesser(0)) return ZERO;
275 if (b.equals(0)) return ONE;
276 var result = bigInt(a.value, a.sign);
278 if (b.mod(2).equals(0)) {
279 var c = result.pow(b.over(2));
282 return result.times(result.pow(b.minus(1)));
286 var first = m || self;
287 return o.add(first, 1);
290 var first = m || self;
291 return o.subtract(first, 1);
293 compare: function (n, m) {
294 var first = self, second;
295 if (m) (first = parse(n)) && (second = parse(m, first));
296 else second = parse(n, first);
297 normalize(first, second);
298 if (first.value.length === 1 && second.value.length === 1 && first.value[0] === 0 && second.value[0] === 0) return 0;
299 if (second.sign !== first.sign) return first.sign === sign.positive ? 1 : -1;
300 var multiplier = first.sign === sign.positive ? 1 : -1;
301 var a = first.value, b = second.value;
302 for (var i = a.length - 1; i >= 0; i--) {
303 if (a[i] > b[i]) return 1 * multiplier;
304 if (b[i] > a[i]) return -1 * multiplier;
308 compareAbs: function (n, m) {
309 var first = self, second;
310 if (m) (first = parse(n)) && (second = parse(m, first));
311 else second = parse(n, first);
312 first.sign = second.sign = sign.positive;
313 return o.compare(first, second);
315 equals: function (n, m) {
316 return o.compare(n, m) === 0;
318 notEquals: function (n, m) {
319 return !o.equals(n, m);
321 lesser: function (n, m) {
322 return o.compare(n, m) < 0;
324 greater: function (n, m) {
325 return o.compare(n, m) > 0;
327 greaterOrEquals: function (n, m) {
328 return o.compare(n, m) >= 0;
330 lesserOrEquals: function (n, m) {
331 return o.compare(n, m) <= 0;
333 isPositive: function (m) {
334 var first = m || self;
335 return first.sign === sign.positive;
337 isNegative: function (m) {
338 var first = m || self;
339 return first.sign === sign.negative;
341 isEven: function (m) {
342 var first = m || self;
343 return first.value[0] % 2 === 0;
345 isOdd: function (m) {
346 var first = m || self;
347 return first.value[0] % 2 === 1;
349 toString: function (m) {
350 var first = m || self;
351 var str = "", len = first.value.length;
353 str += (base.toString() + first.value[len]).slice(-logBase);
355 while (str[0] === "0") {
358 if (!str.length) str = "0";
359 var s = first.sign === sign.positive ? "" : "-";
362 toJSNumber: function (m) {
363 return +o.toString(m);
365 valueOf: function (m) {
366 return o.toJSNumber(m);
372 var ZERO = bigInt([0], sign.positive);
373 var ONE = bigInt([1], sign.positive);
374 var MINUS_ONE = bigInt([1], sign.negative);
376 var fnReturn = function (a) {
377 if (typeof a === "undefined") return ZERO;
380 fnReturn.zero = ZERO;
382 fnReturn.minusOne = MINUS_ONE;
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list