5__IDRRT__.Type = function(type) {
9__IDRRT__.Int = new __IDRRT__.Type('Int');
10__IDRRT__.Char = new __IDRRT__.Type('Char');
11__IDRRT__.String = new __IDRRT__.Type('String');
12__IDRRT__.Integer = new __IDRRT__.Type('Integer');
13__IDRRT__.Float = new __IDRRT__.Type('Float');
14__IDRRT__.Forgot = new __IDRRT__.Type('Forgot');
17__IDRRT__.Tailcall = function(f) { this.f = f };
20__IDRRT__.Con = function(i,vars) {
25__IDRRT__.tailcall = function(f) {
33 if (ret instanceof __IDRRT__.Tailcall) {
41__IDRRT__.print = (function(){
43 var util = require('util');
55 BigInteger Javascript code taken from:
56 https://github.com/peterolson
58__IDRRT__.bigInt = (function () {
59 var base = 10000000, logBase = 7;
65 var normalize = function (first, second) {
66 var a = first.value, b = second.value;
67 var length = a.length > b.length ? a.length : b.length;
68 for (var i = 0; i < length; i++) {
72 for (var i = length - 1; i >= 0; i--) {
73 if (a[i] === 0 && b[i] === 0) {
78 if (!a.length) a = [0], b = [0];
83 var parse = function (text, first) {
84 if (typeof text === "object") return text;
86 var s = sign.positive, value = [];
87 if (text[0] === "-") {
91 var text = text.split("e");
92 if (text.length > 2) throw new Error("Invalid integer");
95 if (exp[0] === "+") exp = exp.slice(1);
97 if (exp.lesser(0)) throw new Error("Cannot include negative exponent part for integers");
98 while (exp.notEquals(0)) {
104 if (text === "-0") text = "0";
105 var isValid = /^([0-9][0-9]*)$/.test(text);
106 if (!isValid) throw new Error("Invalid integer");
107 while (text.length) {
108 var divider = text.length > logBase ? text.length - logBase : 0;
109 value.push(+text.slice(divider));
110 text = text.slice(0, divider);
112 var val = bigInt(value, s);
113 if (first) normalize(first, val);
117 var goesInto = function (a, b) {
118 var a = bigInt(a, sign.positive), b = bigInt(b, sign.positive);
119 if (a.equals(0)) throw new Error("Cannot divide by 0");
123 var c = bigInt(a.value, sign.positive), t = c.times(10);
124 while (t.lesser(b)) {
129 while (c.lesserOrEquals(b)) {
133 } while (a.lesserOrEquals(b));
141 var bigInt = function (value, s) {
149 negate: function (m) {
150 var first = m || self;
151 return bigInt(first.value, !first.sign);
154 var first = m || self;
155 return bigInt(first.value, sign.positive);
157 add: function (n, m) {
158 var s, first = self, second;
159 if (m) (first = parse(n)) && (second = parse(m));
160 else second = parse(n, first);
162 if (first.sign !== second.sign) {
163 first = bigInt(first.value, sign.positive);
164 second = bigInt(second.value, sign.positive);
165 return s === sign.positive ?
166 o.subtract(first, second) :
167 o.subtract(second, first);
169 normalize(first, second);
170 var a = first.value, b = second.value;
173 for (var i = 0; i < a.length || carry > 0; i++) {
174 var sum = (a[i] || 0) + (b[i] || 0) + carry;
175 carry = sum >= base ? 1 : 0;
179 return bigInt(result, s);
181 plus: function (n, m) {
184 subtract: function (n, m) {
185 var first = self, second;
186 if (m) (first = parse(n)) && (second = parse(m));
187 else second = parse(n, first);
188 if (first.sign !== second.sign) return o.add(first, o.negate(second));
189 if (first.sign === sign.negative) return o.subtract(o.negate(second), o.negate(first));
190 if (o.compare(first, second) === -1) return o.negate(o.subtract(second, first));
191 var a = first.value, b = second.value;
194 for (var i = 0; i < a.length; i++) {
196 borrow = a[i] < b[i] ? 1 : 0;
197 var minuend = (borrow * base) + a[i] - b[i];
198 result.push(minuend);
200 return bigInt(result, sign.positive);
202 minus: function (n, m) {
203 return o.subtract(n, m);
205 multiply: function (n, m) {
206 var s, first = self, second;
207 if (m) (first = parse(n)) && (second = parse(m));
208 else second = parse(n, first);
209 s = first.sign !== second.sign;
210 var a = first.value, b = second.value;
212 for (var i = 0; i < a.length; i++) {
216 resultSum[i].push(0);
220 for (var i = 0; i < a.length; i++) {
222 for (var j = 0; j < b.length || carry > 0; j++) {
224 var product = y ? (x * y) + carry : carry;
225 carry = product > base ? Math.floor(product / base) : 0;
226 product -= carry * base;
227 resultSum[i].push(product);
231 for (var i = 0; i < resultSum.length; i++) {
232 var len = resultSum[i].length;
233 if (len > max) max = len;
235 var result = [], carry = 0;
236 for (var i = 0; i < max || carry > 0; i++) {
238 for (var j = 0; j < resultSum.length; j++) {
239 sum += resultSum[j][i] || 0;
241 carry = sum > base ? Math.floor(sum / base) : 0;
245 return bigInt(result, s);
247 times: function (n, m) {
248 return o.multiply(n, m);
250 divmod: function (n, m) {
251 var s, first = self, second;
252 if (m) (first = parse(n)) && (second = parse(m));
253 else second = parse(n, first);
254 s = first.sign !== second.sign;
255 if (bigInt(first.value, first.sign).equals(0)) return {
256 quotient: bigInt([0], sign.positive),
257 remainder: bigInt([0], sign.positive)
259 if (second.equals(0)) throw new Error("Cannot divide by zero");
260 var a = first.value, b = second.value;
261 var result = [], remainder = [];
262 for (var i = a.length - 1; i >= 0; i--) {
263 var n = [a[i]].concat(remainder);
264 var quotient = goesInto(b, n);
265 result.push(quotient.result);
266 remainder = quotient.remainder;
270 quotient: bigInt(result, s),
271 remainder: bigInt(remainder, first.sign)
274 divide: function (n, m) {
275 return o.divmod(n, m).quotient;
277 over: function (n, m) {
278 return o.divide(n, m);
280 mod: function (n, m) {
281 return o.divmod(n, m).remainder;
283 pow: function (n, m) {
284 var first = self, second;
285 if (m) (first = parse(n)) && (second = parse(m));
286 else second = parse(n, first);
287 var a = first, b = second;
288 if (b.lesser(0)) return ZERO;
289 if (b.equals(0)) return ONE;
290 var result = bigInt(a.value, a.sign);
292 if (b.mod(2).equals(0)) {
293 var c = result.pow(b.over(2));
296 return result.times(result.pow(b.minus(1)));
300 var first = m || self;
301 return o.add(first, 1);
304 var first = m || self;
305 return o.subtract(first, 1);
307 compare: function (n, m) {
308 var first = self, second;
309 if (m) (first = parse(n)) && (second = parse(m, first));
310 else second = parse(n, first);
311 normalize(first, second);
312 if (first.value.length === 1 && second.value.length === 1 && first.value[0] === 0 && second.value[0] === 0) return 0;
313 if (second.sign !== first.sign) return first.sign === sign.positive ? 1 : -1;
314 var multiplier = first.sign === sign.positive ? 1 : -1;
315 var a = first.value, b = second.value;
316 for (var i = a.length - 1; i >= 0; i--) {
317 if (a[i] > b[i]) return 1 * multiplier;
318 if (b[i] > a[i]) return -1 * multiplier;
322 compareAbs: function (n, m) {
323 var first = self, second;
324 if (m) (first = parse(n)) && (second = parse(m, first));
325 else second = parse(n, first);
326 first.sign = second.sign = sign.positive;
327 return o.compare(first, second);
329 equals: function (n, m) {
330 return o.compare(n, m) === 0;
332 notEquals: function (n, m) {
333 return !o.equals(n, m);
335 lesser: function (n, m) {
336 return o.compare(n, m) < 0;
338 greater: function (n, m) {
339 return o.compare(n, m) > 0;
341 greaterOrEquals: function (n, m) {
342 return o.compare(n, m) >= 0;
344 lesserOrEquals: function (n, m) {
345 return o.compare(n, m) <= 0;
347 isPositive: function (m) {
348 var first = m || self;
349 return first.sign === sign.positive;
351 isNegative: function (m) {
352 var first = m || self;
353 return first.sign === sign.negative;
355 isEven: function (m) {
356 var first = m || self;
357 return first.value[0] % 2 === 0;
359 isOdd: function (m) {
360 var first = m || self;
361 return first.value[0] % 2 === 1;
363 toString: function (m) {
364 var first = m || self;
365 var str = "", len = first.value.length;
367 str += (base.toString() + first.value[len]).slice(-logBase);
369 while (str[0] === "0") {
372 if (!str.length) str = "0";
373 var s = first.sign === sign.positive ? "" : "-";
376 toJSNumber: function (m) {
377 return +o.toString(m);
379 valueOf: function (m) {
380 return o.toJSNumber(m);
386 var ZERO = bigInt([0], sign.positive);
387 var ONE = bigInt([1], sign.positive);
388 var MINUS_ONE = bigInt([1], sign.negative);
390 var fnReturn = function (a) {
391 if (typeof a === "undefined") return ZERO;
394 fnReturn.zero = ZERO;
396 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