UNPKG

js-slang

Version:

Javascript-based implementations of Source, written in Typescript

854 lines 36.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.inexact = exports.exact = exports.denominator = exports.numerator = exports.even$63$ = exports.odd$63$ = exports.lcm = exports.gcd = exports.modulo = exports.remainder = exports.quotient = exports.abs = exports.$47$ = exports.$42$ = exports.$45$ = exports.$43$ = exports.min = exports.max = exports.negative$63$ = exports.positive$63$ = exports.nan$63$ = exports.infinity$63$ = exports.zero$63$ = exports.$62$$61$ = exports.$62$ = exports.$60$$61$ = exports.$60$ = exports.$61$ = exports.inexact$63$ = exports.exact$63$ = exports.complex$63$ = exports.real$63$ = exports.rational$63$ = exports.integer$63$ = exports.number$63$ = exports.make_number = exports.boolean$61$$63$ = exports.or = exports.and = exports.not = exports.truthy = exports.boolean$63$ = exports.procedure$63$ = exports.apply = exports.compose = exports.promise$45$forced$63$ = exports.force = exports.promise$63$ = exports.make$45$promise = exports.error = void 0; exports.caaaar = exports.cdddr = exports.cddar = exports.cdadr = exports.cdaar = exports.caddr = exports.cadar = exports.caadr = exports.caaar = exports.cddr = exports.cdar = exports.cadr = exports.caar = exports.cdr = exports.car = exports.set$45$cdr$33$ = exports.set$45$car$33$ = exports.not$45$pair$63$ = exports.pair$63$ = exports.xcons = exports.cons = exports.LOG10E = exports.LOG2E = exports.LN10 = exports.LN2 = exports.SQRT1$47$2 = exports.SQRT2 = exports.E = exports.PI = exports.angle = exports.magnitude = exports.imag$45$part = exports.real$45$part = exports.make$45$polar = exports.make$45$rectangular = exports.round = exports.truncate = exports.ceiling = exports.floor = exports.atan = exports.acos = exports.asin = exports.tan = exports.cos = exports.sin = exports.sqrt = exports.log = exports.exp = exports.expt = exports.square = void 0; exports.reduce$45$left = exports.reduce = exports.fold$45$right = exports.fold$45$left = exports.fold = exports.map = exports.any = exports.filter = exports.list$63$ = exports.null$45$list$63$ = exports.dotted$45$list$63$ = exports.proper$45$list$63$ = exports.circular$45$list$63$ = exports.list$45$set$33$ = exports.tenth = exports.ninth = exports.eighth = exports.seventh = exports.sixth = exports.fifth = exports.fourth = exports.third = exports.second = exports.first = exports.circular$45$list = exports.last$45$pair = exports.last = exports.list$45$ref = exports.list$45$tail = exports.list$45$tabulate = exports.make$45$list = exports.cons$42$ = exports.list$42$ = exports.null$63$ = exports.list = exports.cddddr = exports.cdddar = exports.cddadr = exports.cddaar = exports.cdaddr = exports.cdadar = exports.cdaadr = exports.cdaaar = exports.cadddr = exports.caddar = exports.cadadr = exports.cadaar = exports.caaddr = exports.caadar = exports.caaadr = void 0; exports.list$45$$62$string = exports.string$45$$62$list = exports.number$45$$62$string = exports.string$45$$62$number = exports.string$45$for$45$each = exports.string$45$map = exports.string$45$copy = exports.string$45$append = exports.substring = exports.string$62$$61$$63$ = exports.string$60$$61$$63$ = exports.string$62$$63$ = exports.string$60$$63$ = exports.string$61$$63$ = exports.string$45$ref = exports.string$45$length = exports.string = exports.make$45$string = exports.string$63$ = exports.equal$63$ = exports.eqv$63$ = exports.eq$63$ = exports.string$45$$62$symbol = exports.symbol$61$$63$ = exports.symbol$63$ = exports._Symbol = exports.vector$45$fill$33$ = exports.list$45$$62$vector = exports.vector$45$$62$list = exports.vector$45$set$33$ = exports.vector$45$length = exports.vector$45$ref = exports.vector$45$empty$63$ = exports.vector$63$ = exports.vector = exports.make$45$vector = exports.$36$resolve$45$splice = exports.$36$make$45$splice = exports.drop$45$right = exports.drop = exports.take$45$right = exports.take = exports.reverse = exports.concatenate = exports.append = exports.length$43$ = exports.length = exports.list$45$copy = exports.list$61$ = exports.reduce$45$right = void 0; const core = require("./core"); const source_scheme_library_1 = require("./source-scheme-library"); // error definition follows sicp package const error = (value, ...strs) => { const output = (strs[0] === undefined ? "" : strs[0] + "") + (0, source_scheme_library_1.schemeToString)(value); throw new Error(output); }; exports.error = error; // delay and force operations // in scm-slang, we will represent promises as a list, consisting of a promise tag // and a pair of whether the promise has already been evaluated and the thunk itself. // this is similar to the way promises are implemented in chibi-scheme. // the boolean will be used to check if the promise has previously been forced. // currently based on SRFI 155. const make$45$promise = (thunk) => { return (0, exports.list)((0, exports.cons)(false, thunk), new _Symbol("promise")); }; exports.make$45$promise = make$45$promise; const promise$63$ = (p) => { return ((0, exports.pair$63$)(p) && (0, exports.pair$63$)((0, exports.cdr)(p)) && (0, exports.symbol$61$$63$)((0, exports.cadr)(p), new _Symbol("promise"))); }; exports.promise$63$ = promise$63$; const force = (p) => { if (!(0, exports.promise$63$)(p)) { (0, exports.error)("force: expected promise"); } // get the pair of the promise const promise_pair = (0, exports.car)(p); // if previously forced if ((0, exports.car)(promise_pair)) { return (0, exports.cdr)(promise_pair); } // else force the promise const result = (0, exports.cdr)(promise_pair)(); // and update the promise (0, exports.set$45$car$33$)(promise_pair, true); (0, exports.set$45$cdr$33$)(promise_pair, result); return result; }; exports.force = force; const promise$45$forced$63$ = (p) => { if (!(0, exports.promise$63$)(p)) { return false; } return (0, exports.caar)(p); }; exports.promise$45$forced$63$ = promise$45$forced$63$; // procedural operations const identity = (x) => x; const compose = (...fs) => { return fs.reduce((f, g) => (x) => f(g(x)), identity); }; exports.compose = compose; const apply = (fun, ...args) => { // the last argument must be a list. // we need to convert it into an array, const lastList = args.pop(); if (!(0, exports.list$63$)(lastList)) { (0, exports.error)("apply: last argument must be a list"); } // convert the list into an array. const lastArray = []; let current = lastList; while (current !== null) { lastArray.push((0, exports.car)(current)); current = (0, exports.cdr)(current); } // append the array to the rest of the arguments. const allArgs = args.concat(lastArray); return fun(...allArgs); }; exports.apply = apply; const procedure$63$ = (p) => typeof p === "function"; exports.procedure$63$ = procedure$63$; // boolean operations exports.boolean$63$ = core.is_boolean; exports.truthy = core.truthy; const atomic_or = core.atomic_or; const atomic_and = core.atomic_and; exports.not = core.atomic_not; const and = (...args) => args.reduce(atomic_and, true); exports.and = and; const or = (...args) => args.reduce(atomic_or, false); exports.or = or; const boolean$61$$63$ = (p1, p2) => (0, exports.and)((0, exports.boolean$63$)(p1), (0, exports.boolean$63$)(p2), (0, exports.or)((0, exports.and)(p1, p2), (0, exports.not)((0, exports.or)(p1, p2)))); exports.boolean$61$$63$ = boolean$61$$63$; // math operations exports.make_number = core.make_number; exports.number$63$ = core.is_number; exports.integer$63$ = core.is_integer; exports.rational$63$ = core.is_rational; exports.real$63$ = core.is_real; exports.complex$63$ = core.is_complex; exports.exact$63$ = core.is_exact; exports.inexact$63$ = core.is_inexact; const atomic_negate = core.atomic_negate; const atomic_inverse = core.atomic_inverse; const atomic_less_than = core.atomic_less_than; const atomic_less_than_or_equals = core.atomic_less_than_or_equals; const atomic_greater_than = core.atomic_greater_than; const atomic_greater_than_or_equals = core.atomic_greater_than_or_equals; const atomic_equals = core.atomic_equals; const atomic_add = core.atomic_add; const atomic_subtract = core.atomic_subtract; const atomic_multiply = core.atomic_multiply; const atomic_divide = core.atomic_divide; const $61$ = (first, second, ...rest) => { if (rest.length === 0) { return atomic_equals(first, second); } return atomic_equals(first, second) && (0, exports.$61$)(second, ...rest); }; exports.$61$ = $61$; const $60$ = (first, second, ...rest) => { if (rest.length === 0) { return atomic_less_than(first, second); } return atomic_less_than(first, second) && (0, exports.$60$)(second, ...rest); }; exports.$60$ = $60$; const $60$$61$ = (first, second, ...rest) => { if (rest.length === 0) { return atomic_less_than_or_equals(first, second); } return atomic_less_than_or_equals(first, second) && (0, exports.$60$$61$)(second, ...rest); }; exports.$60$$61$ = $60$$61$; const $62$ = (first, second, ...rest) => { if (rest.length === 0) { return atomic_greater_than(first, second); } return atomic_greater_than(first, second) && (0, exports.$62$)(second, ...rest); }; exports.$62$ = $62$; const $62$$61$ = (first, second, ...rest) => { if (rest.length === 0) { return atomic_greater_than_or_equals(first, second); } return (atomic_greater_than_or_equals(first, second) && (0, exports.$62$$61$)(second, ...rest)); }; exports.$62$$61$ = $62$$61$; const zero$63$ = (n) => (0, exports.$61$)(n, (0, exports.make_number)(0)); exports.zero$63$ = zero$63$; const infinity$63$ = (n) => (0, exports.$61$)(n, core.SchemeReal.INFINITY) || (0, exports.$61$)(n, core.SchemeReal.NEG_INFINITY); exports.infinity$63$ = infinity$63$; const nan$63$ = (n) => n === core.SchemeReal.NAN; exports.nan$63$ = nan$63$; const positive$63$ = (n) => (0, exports.$62$)(n, (0, exports.make_number)(0)); exports.positive$63$ = positive$63$; const negative$63$ = (n) => (0, exports.$60$)(n, (0, exports.make_number)(0)); exports.negative$63$ = negative$63$; const max = (first, ...args) => args.reduce((max, current, index, array) => atomic_greater_than(current, max) ? current : max, first); exports.max = max; const min = (first, ...args) => args.reduce((min, current, index, array) => atomic_less_than(current, min) ? current : min, first); exports.min = min; const $43$ = (...args) => args.reduce(atomic_add, (0, exports.make_number)(0)); exports.$43$ = $43$; const $45$ = (first, ...args) => args.length === 0 ? atomic_negate(first) : atomic_subtract(first, (0, exports.$43$)(...args)); exports.$45$ = $45$; const $42$ = (...args) => args.reduce(atomic_multiply, (0, exports.make_number)(1)); exports.$42$ = $42$; const $47$ = (first, ...args) => args.length === 0 ? atomic_inverse(first) : atomic_divide(first, (0, exports.$42$)(...args)); exports.$47$ = $47$; const abs = (n) => (0, exports.negative$63$)(n) ? atomic_negate(n) : n; exports.abs = abs; const quotient = (a, b) => { if (!(0, exports.integer$63$)(a) || !(0, exports.integer$63$)(b)) { (0, exports.error)("quotient: expected integers"); } if (atomic_equals(b, (0, exports.make_number)(0))) { (0, exports.error)("quotient: division by zero"); } let remainder = (0, exports.modulo)(a, b); let quotient = atomic_divide(atomic_subtract(a, remainder), b); if (atomic_equals(remainder, (0, exports.make_number)(0))) { return quotient; } // if both a and b are same-signed, we are done if (atomic_less_than(a, (0, exports.make_number)(0)) && atomic_less_than(b, (0, exports.make_number)(0))) { return quotient; } if (atomic_greater_than(a, (0, exports.make_number)(0)) && atomic_greater_than(b, (0, exports.make_number)(0))) { return quotient; } // if a is negative, we need to increment the quotient // to account for the remainder if (atomic_less_than(a, (0, exports.make_number)(0))) { quotient = atomic_add(quotient, (0, exports.make_number)(1)); } // if b is negative, we need to decrement the quotient // to account for the remainder if (atomic_less_than(b, (0, exports.make_number)(0))) { quotient = atomic_add(quotient, (0, exports.make_number)(1)); } return quotient; }; exports.quotient = quotient; const remainder = (a, b) => { if (!(0, exports.integer$63$)(a) || !(0, exports.integer$63$)(b)) { (0, exports.error)("remainder: expected integers"); } if (atomic_equals(b, (0, exports.make_number)(0))) { (0, exports.error)("remainder: division by zero"); } let q = (0, exports.quotient)(a, b); let remainder = atomic_subtract(a, atomic_multiply(q, b)); return remainder; }; exports.remainder = remainder; const modulo = (a, b) => { if (!(0, exports.integer$63$)(a) || !(0, exports.integer$63$)(b)) { (0, exports.error)("modulo: expected integers"); } if (atomic_equals(b, (0, exports.make_number)(0))) { (0, exports.error)("modulo: division by zero"); } let working = a; while (atomic_greater_than_or_equals((0, exports.abs)(working), (0, exports.abs)(b))) { if (atomic_less_than(working, (0, exports.make_number)(0))) { if (atomic_less_than(b, (0, exports.make_number)(0))) { working = atomic_subtract(working, b); } else { working = atomic_add(working, b); } } else { if (atomic_less_than(b, (0, exports.make_number)(0))) { working = atomic_add(working, b); } else { working = atomic_subtract(working, b); } } } // we need to deal with the sign of the result // in 4 separate cases if (atomic_less_than(working, (0, exports.make_number)(0))) { if (atomic_less_than(b, (0, exports.make_number)(0))) { // both are negative // do nothing return working; } else { // b is positive // result needs to be positive - add b to the working return atomic_add(working, b); } } else { if (atomic_less_than(b, (0, exports.make_number)(0))) { // b is negative // result needs to be negative - add b to the working return atomic_add(working, b); } else { // both are positive // do nothing return working; } } }; exports.modulo = modulo; function atomic_gcd(a, b) { if (atomic_equals(b, (0, exports.make_number)(0))) { return (0, exports.abs)(a); } return (0, exports.abs)(atomic_gcd(b, (0, exports.remainder)(a, b))); } const gcd = (...vals) => { if (vals.length === 0) { return core.SchemeInteger.EXACT_ZERO; } if (vals.length === 1) { return vals[0]; } return vals.reduce(atomic_gcd); }; exports.gcd = gcd; function atomic_lcm(a, b) { return (0, exports.abs)(atomic_multiply((0, exports.quotient)(a, (0, exports.gcd)(a, b)), b)); } const lcm = (...vals) => { if (vals.length === 0) { return core.SchemeInteger.build(1); } if (vals.length === 1) { return vals[0]; } return vals.reduce(atomic_lcm); }; exports.lcm = lcm; exports.odd$63$ = core.odd$63$; exports.even$63$ = core.even$63$; exports.numerator = core.numerator; exports.denominator = core.denominator; exports.exact = core.exact; exports.inexact = core.inexact; const square = (n) => (0, exports.$42$)(n, n); exports.square = square; exports.expt = core.expt; exports.exp = core.exp; exports.log = core.log; exports.sqrt = core.sqrt; exports.sin = core.sin; exports.cos = core.cos; exports.tan = core.tan; exports.asin = core.asin; exports.acos = core.acos; exports.atan = core.atan; exports.floor = core.floor; exports.ceiling = core.ceiling; exports.truncate = core.truncate; exports.round = core.round; exports.make$45$rectangular = core.make$45$rectangular; exports.make$45$polar = core.make$45$polar; exports.real$45$part = core.real$45$part; exports.imag$45$part = core.imag$45$part; exports.magnitude = core.magnitude; exports.angle = core.angle; exports.PI = core.PI; exports.E = core.E; exports.SQRT2 = core.SQRT2; exports.SQRT1$47$2 = core.SQRT1_2; exports.LN2 = core.LN2; exports.LN10 = core.LN10; exports.LOG2E = core.LOG2E; exports.LOG10E = core.LOG10E; // pair operations exports.cons = core.pair; const xcons = (x, y) => core.pair(y, x); exports.xcons = xcons; // low level, but it works. // follows SICP's implementation. const array_test = (p) => { if (Array.isArray === undefined) { return p instanceof Array; } return Array.isArray(p); }; const pair$63$ = (p) => array_test(p) && p.length === 2 && p.pair === true; exports.pair$63$ = pair$63$; exports.not$45$pair$63$ = (0, exports.compose)(exports.not, exports.pair$63$); const set$45$car$33$ = (p, v) => { if ((0, exports.pair$63$)(p)) { p[0] = v; return; } (0, exports.error)("set-car!: expected pair"); }; exports.set$45$car$33$ = set$45$car$33$; const set$45$cdr$33$ = (p, v) => { if ((0, exports.pair$63$)(p)) { p[1] = v; return; } (0, exports.error)("set-cdr!: expected pair"); }; exports.set$45$cdr$33$ = set$45$cdr$33$; // cxr operations const car = (p) => { if ((0, exports.pair$63$)(p)) { return p[0]; } (0, exports.error)("car: expected pair"); }; exports.car = car; const cdr = (p) => { if ((0, exports.pair$63$)(p)) { return p[1]; } (0, exports.error)("cdr: expected pair"); }; exports.cdr = cdr; exports.caar = (0, exports.compose)(exports.car, exports.car); exports.cadr = (0, exports.compose)(exports.car, exports.cdr); exports.cdar = (0, exports.compose)(exports.cdr, exports.car); exports.cddr = (0, exports.compose)(exports.cdr, exports.cdr); exports.caaar = (0, exports.compose)(exports.car, exports.caar); exports.caadr = (0, exports.compose)(exports.car, exports.cadr); exports.cadar = (0, exports.compose)(exports.car, exports.cdar); exports.caddr = (0, exports.compose)(exports.car, exports.cddr); exports.cdaar = (0, exports.compose)(exports.cdr, exports.caar); exports.cdadr = (0, exports.compose)(exports.cdr, exports.cadr); exports.cddar = (0, exports.compose)(exports.cdr, exports.cdar); exports.cdddr = (0, exports.compose)(exports.cdr, exports.cddr); exports.caaaar = (0, exports.compose)(exports.car, exports.caaar); exports.caaadr = (0, exports.compose)(exports.car, exports.caadr); exports.caadar = (0, exports.compose)(exports.car, exports.cadar); exports.caaddr = (0, exports.compose)(exports.car, exports.caddr); exports.cadaar = (0, exports.compose)(exports.car, exports.cdaar); exports.cadadr = (0, exports.compose)(exports.car, exports.cdadr); exports.caddar = (0, exports.compose)(exports.car, exports.cddar); exports.cadddr = (0, exports.compose)(exports.car, exports.cdddr); exports.cdaaar = (0, exports.compose)(exports.cdr, exports.caaar); exports.cdaadr = (0, exports.compose)(exports.cdr, exports.caadr); exports.cdadar = (0, exports.compose)(exports.cdr, exports.cadar); exports.cdaddr = (0, exports.compose)(exports.cdr, exports.caddr); exports.cddaar = (0, exports.compose)(exports.cdr, exports.cadaar); exports.cddadr = (0, exports.compose)(exports.cdr, exports.cadadr); exports.cdddar = (0, exports.compose)(exports.cdr, exports.caddar); exports.cddddr = (0, exports.compose)(exports.cdr, exports.cadddr); // list operations (SRFI-1) const list = (...args) => { if (args.length === 0) { return null; } return (0, exports.cons)(args[0], (0, exports.list)(...args.slice(1))); }; exports.list = list; const null$63$ = (xs) => xs === null; exports.null$63$ = null$63$; const list$42$ = (curr, ...rest) => rest.length === 0 ? curr : (0, exports.cons)(curr, (0, exports.list$42$)(...rest)); exports.list$42$ = list$42$; exports.cons$42$ = exports.list$42$; const make$45$list = (n, v = (0, exports.make_number)(0)) => (0, exports.$61$)(n, (0, exports.make_number)(0)) ? null : (0, exports.cons)(v, (0, exports.make$45$list)(atomic_subtract(n, (0, exports.make_number)(1)), v)); exports.make$45$list = make$45$list; const list$45$tabulate = (n, f) => (0, exports.$61$)(n, (0, exports.make_number)(0)) ? null : (0, exports.cons)(f(n), (0, exports.list$45$tabulate)(atomic_subtract(n, (0, exports.make_number)(1)), f)); exports.list$45$tabulate = list$45$tabulate; const list$45$tail = (xs, k) => (0, exports.$61$)(k, (0, exports.make_number)(0)) ? xs : (0, exports.list$45$tail)((0, exports.cdr)(xs), (0, exports.$45$)(k, (0, exports.make_number)(1))); exports.list$45$tail = list$45$tail; const list$45$ref = (xs, k) => (0, exports.car)((0, exports.list$45$tail)(xs, k)); exports.list$45$ref = list$45$ref; const last = (xs) => (0, exports.null$63$)(xs) ? (0, exports.error)("last: empty list") : (0, exports.null$63$)((0, exports.cdr)(xs)) ? (0, exports.car)(xs) : (0, exports.last)((0, exports.cdr)(xs)); exports.last = last; const last$45$pair = (xs) => (0, exports.null$63$)(xs) ? (0, exports.error)("last-pair: empty list") : (0, exports.null$63$)((0, exports.cdr)(xs)) ? xs : (0, exports.last$45$pair)((0, exports.cdr)(xs)); exports.last$45$pair = last$45$pair; const circular$45$list = (...args) => { const normal_list = (0, exports.list)(...args); if ((0, exports.null$63$)(normal_list)) { return normal_list; } // else set the last pair to the list (0, exports.set$45$cdr$33$)((0, exports.last$45$pair)(normal_list), normal_list); return normal_list; }; exports.circular$45$list = circular$45$list; exports.first = exports.car; exports.second = exports.cadr; exports.third = exports.caddr; exports.fourth = exports.cadddr; exports.fifth = (0, exports.compose)(exports.car, exports.cddddr); exports.sixth = (0, exports.compose)(exports.cadr, exports.cddddr); exports.seventh = (0, exports.compose)(exports.caddr, exports.cddddr); exports.eighth = (0, exports.compose)(exports.cadddr, exports.cddddr); exports.ninth = (0, exports.compose)(exports.car, exports.cddddr, exports.cddddr); exports.tenth = (0, exports.compose)(exports.cadr, exports.cddddr, exports.cddddr); const list$45$set$33$ = (xs, k, v) => (0, exports.set$45$car$33$)((0, exports.list$45$tail)(xs, k), v); exports.list$45$set$33$ = list$45$set$33$; const circular$45$list$63$ = (cxs) => { function c_list_helper(xs, ys) { // we shall do this with the fast and slow pointer method if ((0, exports.null$63$)(xs) || (0, exports.null$63$)(ys)) { return false; } if ((0, exports.not$45$pair$63$)(xs) || (0, exports.not$45$pair$63$)(ys)) { return false; } if ((0, exports.not$45$pair$63$)((0, exports.cdr)(ys))) { return false; } if (xs === ys) { return true; } return c_list_helper((0, exports.cdr)(xs), (0, exports.cddr)(ys)); } if ((0, exports.null$63$)(cxs) || (0, exports.not$45$pair$63$)(cxs)) { return false; } return c_list_helper(cxs, (0, exports.cdr)(cxs)); }; exports.circular$45$list$63$ = circular$45$list$63$; const proper$45$list$63$ = (pxs) => { function is_list(xs) { if ((0, exports.null$63$)(xs)) { return true; } if ((0, exports.not$45$pair$63$)(xs)) { return false; } return is_list((0, exports.cdr)(xs)); } return !(0, exports.circular$45$list$63$)(pxs) && is_list(pxs); }; exports.proper$45$list$63$ = proper$45$list$63$; const dotted$45$list$63$ = (dxs) => !(0, exports.proper$45$list$63$)(dxs) && !(0, exports.circular$45$list$63$)(dxs); exports.dotted$45$list$63$ = dotted$45$list$63$; exports.null$45$list$63$ = exports.null$63$; exports.list$63$ = exports.proper$45$list$63$; const filter = (pred, xs) => (0, exports.null$63$)(xs) ? null : pred((0, exports.car)(xs)) ? (0, exports.cons)((0, exports.car)(xs), (0, exports.filter)(pred, (0, exports.cdr)(xs))) : (0, exports.filter)(pred, (0, exports.cdr)(xs)); exports.filter = filter; const any = (pred, xs) => (0, exports.null$63$)(xs) ? false : pred((0, exports.car)(xs)) ? true : (0, exports.any)(pred, (0, exports.cdr)(xs)); exports.any = any; const map = (f, xs, ...rest) => { const all_lists = [xs, ...rest]; return (0, exports.any)(exports.null$63$, core.vector$45$$62$list(all_lists)) ? null : (0, exports.cons)(f(...all_lists.map(exports.car)), (0, exports.map)(f, ...all_lists.map(exports.cdr))); }; exports.map = map; const fold = (f, acc, xs, ...rest) => { const all_lists = [xs, ...rest]; return (0, exports.any)(exports.null$63$, core.vector$45$$62$list(all_lists)) ? acc : (0, exports.fold)(f, f(acc, ...all_lists.map(exports.car)), ...all_lists.map(exports.cdr)); }; exports.fold = fold; exports.fold$45$left = exports.fold; const fold$45$right = (f, acc, xs, ...rest) => { const all_lists = [xs, ...rest]; return (0, exports.any)(exports.null$63$, core.vector$45$$62$list(all_lists)) ? acc : f(...all_lists.map(exports.car), (0, exports.fold$45$right)(f, acc, ...all_lists.map(exports.cdr))); }; exports.fold$45$right = fold$45$right; const reduce = (f, ridentity, xs) => (0, exports.null$63$)(xs) ? ridentity : (0, exports.fold)(f, (0, exports.car)(xs), (0, exports.cdr)(xs)); exports.reduce = reduce; exports.reduce$45$left = exports.reduce; const reduce$45$right = (f, ridentity, xs) => ((0, exports.null$63$)(xs) ? ridentity : (0, exports.fold$45$right)(f, (0, exports.car)(xs), (0, exports.cdr)(xs))); exports.reduce$45$right = reduce$45$right; const list$61$ = (elt, ...rest) => { if (rest.length === 0 || rest.length === 1) { return true; } const first = rest[0]; const next = rest[1]; const next_rest = rest.slice(1); return elt(first, next) && (0, exports.list$61$)(elt, ...next_rest); }; exports.list$61$ = list$61$; const list$45$copy = (xs) => (0, exports.fold$45$right)(exports.cons, null, xs); exports.list$45$copy = list$45$copy; const length = (xs) => (0, exports.fold$45$left)((acc, _) => atomic_add(acc, (0, exports.make_number)(1)), (0, exports.make_number)(0), xs); exports.length = length; const length$43$ = (xs) => (0, exports.circular$45$list$63$)(xs) ? (0, exports.error)("length: infinite list") : (0, exports.length)(xs); exports.length$43$ = length$43$; const append = (...xss) => { if (xss.length === 0) { return null; } const first = xss[0]; const rest = xss.slice(1); if ((0, exports.null$63$)(first)) { return (0, exports.append)(...rest); } return (0, exports.cons)((0, exports.car)(first), (0, exports.append)((0, exports.cdr)(first), ...rest)); }; exports.append = append; const concatenate = (xss) => (0, exports.apply)(exports.append, xss); exports.concatenate = concatenate; const reverse = (xs) => (0, exports.fold$45$left)(exports.xcons, null, xs); exports.reverse = reverse; const take = (xs, i) => { if ((0, exports.$61$)(i, (0, exports.make_number)(0))) { return null; } else { return (0, exports.cons)((0, exports.car)(xs), (0, exports.take)((0, exports.cdr)(xs), atomic_subtract(i, (0, exports.make_number)(1)))); } }; exports.take = take; const take$45$right = (xs, i) => { const reversed_list = (0, exports.reverse)(xs); return (0, exports.reverse)((0, exports.take)(reversed_list, i)); }; exports.take$45$right = take$45$right; const drop = (xs, i) => { if ((0, exports.$61$)(i, (0, exports.make_number)(0))) { return xs; } else { return (0, exports.drop)((0, exports.cdr)(xs), atomic_subtract(i, (0, exports.make_number)(1))); } }; exports.drop = drop; const drop$45$right = (xs, i) => { const reversed_list = (0, exports.reverse)(xs); return (0, exports.reverse)((0, exports.drop)(reversed_list, i)); }; exports.drop$45$right = drop$45$right; // splice resolution class SpliceMarker { constructor(value) { this.value = value; } } const $36$make$45$splice = (xs) => new SpliceMarker(xs); exports.$36$make$45$splice = $36$make$45$splice; // at runtime, splices the list into the parent list. const $36$resolve$45$splice = (xs) => { if ((0, exports.null$63$)(xs)) { return null; } const first = (0, exports.car)(xs); const rest = (0, exports.cdr)(xs); if (first instanceof SpliceMarker) { if (!(0, exports.list$63$)(first.value)) { (0, exports.error)("splice: expected list"); } return (0, exports.append)(first.value, (0, exports.$36$resolve$45$splice)(rest)); } else { return (0, exports.cons)(first, (0, exports.$36$resolve$45$splice)(rest)); } }; exports.$36$resolve$45$splice = $36$resolve$45$splice; // vectors (SRFI-133) const make$45$vector = (size, fill) => { const vector = new Array(size); if (fill !== undefined) { vector.fill(fill); } return vector; }; exports.make$45$vector = make$45$vector; const vector = (...args) => args; exports.vector = vector; // vector-unfold // vector-unfold-right // vector-copy // vector-append // vector-concatenate // vector-append-subvectors const vector$63$ = (v) => Array.isArray(v); exports.vector$63$ = vector$63$; const vector$45$empty$63$ = (v) => (0, exports.vector$63$)(v) && v.length === 0; exports.vector$45$empty$63$ = vector$45$empty$63$; // vector= const vector$45$ref = (v, i) => { const index = core.coerce_to_number(i); if (index < 0 || index >= v.length) { (0, exports.error)("vector-ref: index out of bounds"); } return v[index]; }; exports.vector$45$ref = vector$45$ref; const vector$45$length = (v) => (0, exports.make_number)(v.length); exports.vector$45$length = vector$45$length; // all iteration functions not implemented yet // all search functions not implemented yet const vector$45$set$33$ = (v, i, x) => { const index = core.coerce_to_number(i); if (index < 0 || index >= v.length) { (0, exports.error)("vector-set!: index out of bounds"); } v[index] = x; }; exports.vector$45$set$33$ = vector$45$set$33$; exports.vector$45$$62$list = core.vector$45$$62$list; const list$45$$62$vector = (l) => { const arr = []; let current = l; while (current !== null) { arr.push((0, exports.car)(current)); current = (0, exports.cdr)(current); } return arr; }; exports.list$45$$62$vector = list$45$$62$vector; const vector$45$fill$33$ = (v, fill, start, end) => { const s = start === undefined ? 0 : core.coerce_to_number(start); const e = end === undefined ? v.length : core.coerce_to_number(end); v.fill(fill, s, e); }; exports.vector$45$fill$33$ = vector$45$fill$33$; // symbols class _Symbol { constructor(sym) { this.sym = sym; } toString() { return this.sym; } equals(other) { return other instanceof _Symbol && this.sym === other.sym; } } exports._Symbol = _Symbol; const symbol$63$ = function (s) { return s instanceof _Symbol; }; exports.symbol$63$ = symbol$63$; const symbol$61$$63$ = function (s1, s2) { return s1 instanceof _Symbol && s2 instanceof _Symbol && s1.equals(s2); }; exports.symbol$61$$63$ = symbol$61$$63$; const string$45$$62$symbol = (s) => new _Symbol(s); exports.string$45$$62$symbol = string$45$$62$symbol; // equality predicates const eq$63$ = function (x, y) { if ((0, exports.symbol$63$)(x) && (0, exports.symbol$63$)(y)) { return x.sym === y.sym; } else if ((0, exports.number$63$)(x) && (0, exports.number$63$)(y)) { return (0, exports.$61$)(x, y); } else { return x === y; } }; exports.eq$63$ = eq$63$; exports.eqv$63$ = exports.eq$63$; const equal$63$ = function (x, y) { if (x === y) { return true; } else if ((0, exports.number$63$)(x) && (0, exports.number$63$)(y)) { return (0, exports.$61$)(x, y); } else if ((0, exports.pair$63$)(x) && (0, exports.pair$63$)(y)) { return (0, exports.equal$63$)((0, exports.car)(x), (0, exports.car)(y)) && (0, exports.equal$63$)((0, exports.cdr)(x), (0, exports.cdr)(y)); } else if ((0, exports.symbol$63$)(x) && (0, exports.symbol$63$)(y)) { return x.sym === y.sym; } else if ((0, exports.vector$63$)(x) && (0, exports.vector$63$)(y)) { if ((0, exports.vector$45$length)(x) !== (0, exports.vector$45$length)(y)) { return false; } for (let i = 0; i < (0, exports.vector$45$length)(x); i++) { if (!(0, exports.equal$63$)(x[i], y[i])) { return false; } } return true; } else { return false; } }; exports.equal$63$ = equal$63$; // string operations const string$63$ = (s) => typeof s === "string"; exports.string$63$ = string$63$; const make$45$string = (n, ch = " ") => { // make sure that the character is a single character if (ch.length !== 1) { (0, exports.error)("make-string: expected single character"); } let result = ""; for (let i = 0; i < core.coerce_to_number(n); i++) { result += ch; } return result; }; exports.make$45$string = make$45$string; const string = (...args) => args.join(""); exports.string = string; const string$45$length = (s) => (0, exports.make_number)(String(s.length)); exports.string$45$length = string$45$length; const string$45$ref = (s, i) => { const index = core.coerce_to_number(i); if (index < 0 || index >= s.length) { (0, exports.error)("string-ref: index out of bounds"); } return s[index]; }; exports.string$45$ref = string$45$ref; const string$61$$63$ = (s1, s2) => s1 === s2; exports.string$61$$63$ = string$61$$63$; const string$60$$63$ = (s1, s2) => s1 < s2; exports.string$60$$63$ = string$60$$63$; const string$62$$63$ = (s1, s2) => s1 > s2; exports.string$62$$63$ = string$62$$63$; const string$60$$61$$63$ = (s1, s2) => s1 <= s2; exports.string$60$$61$$63$ = string$60$$61$$63$; const string$62$$61$$63$ = (s1, s2) => s1 >= s2; exports.string$62$$61$$63$ = string$62$$61$$63$; const substring = (s, start, end) => { const s_start = core.coerce_to_number(start); const s_end = end === undefined ? s.length : core.coerce_to_number(end); if (s_start < 0 || s_end > s.length || s_start > s_end) { (0, exports.error)("substring: index out of bounds"); } return s.substring(s_start, s_end); }; exports.substring = substring; exports.string$45$append = exports.string; const string$45$copy = (s) => s; exports.string$45$copy = string$45$copy; const string$45$map = (f, s) => { let result = ""; for (let i = 0; i < s.length; i++) { result += f(s[i]); } return result; }; exports.string$45$map = string$45$map; const string$45$for$45$each = (f, s) => { for (let i = 0; i < s.length; i++) { f(s[i]); } }; exports.string$45$for$45$each = string$45$for$45$each; const string$45$$62$number = (s) => { try { return (0, exports.make_number)(s); } catch (e) { (0, exports.error)("string->number: invalid number"); } }; exports.string$45$$62$number = string$45$$62$number; const number$45$$62$string = (n) => n.toString(); exports.number$45$$62$string = number$45$$62$string; const string$45$$62$list = (s) => { let result = null; for (let i = s.length - 1; i >= 0; i--) { result = (0, exports.cons)(s[i], result); } return result; }; exports.string$45$$62$list = string$45$$62$list; const list$45$$62$string = (l) => { let result = ""; let current = l; while (current !== null) { result += String((0, exports.car)(current)); current = (0, exports.cdr)(current); } return result; }; exports.list$45$$62$string = list$45$$62$string; //# sourceMappingURL=base.js.map