js-slang
Version:
Javascript-based implementations of Source, written in Typescript
854 lines • 36.1 kB
JavaScript
"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