algebrite
Version:
Computer Algebra System in Coffeescript
2,372 lines (1,799 loc) • 345 kB
JavaScript
// Generated by CoffeeScript 1.9.0
(function() {
var $, ABS, ADD, ADJ, AND, ARCCOS, ARCCOSH, ARCSIN, ARCSINH, ARCTAN, ARCTANH, ARG, ATOMIZE, AUTOEXPAND, BAKE, BESSELJ, BESSELY, BINDING, BINOMIAL, BINOM_check_args, BUF, C1, C2, C3, C4, C5, C6, CEILING, CHECK, CHOOSE, CIRCEXP, CLEAR, CLOCK, COEFF, COFACTOR, CONDENSE, CONJ, CONS, CONTRACT, COS, COSH, Condense, DEBUG, DECOMP, DEFINT, DEGREE, DENOMINATOR, DERIVATIVE, DET, DET_check_arg, DIM, DIRAC, DISPLAY, DIVISORS, DO, DOT, DOUBLE, DRAW, DRAWX, DSOLVE, E, EIGEN, EIGENVAL, EIGENVEC, EIG_N, EIG_check_arg, EIG_yydd, EIG_yyqq, ERF, ERFC, EVAL, EXP, EXPAND, EXPCOS, EXPSIN, Eval, Eval_Eval, Eval_abs, Eval_add, Eval_adj, Eval_and, Eval_arccos, Eval_arccosh, Eval_arcsin, Eval_arcsinh, Eval_arctan, Eval_arctanh, Eval_arg, Eval_besselj, Eval_bessely, Eval_binding, Eval_binomial, Eval_ceiling, Eval_check, Eval_choose, Eval_circexp, Eval_clear, Eval_clock, Eval_coeff, Eval_cofactor, Eval_condense, Eval_conj, Eval_cons, Eval_contract, Eval_cos, Eval_cosh, Eval_decomp, Eval_defint, Eval_degree, Eval_denominator, Eval_derivative, Eval_det, Eval_dim, Eval_dirac, Eval_divisors, Eval_do, Eval_dsolve, Eval_eigen, Eval_eigenval, Eval_eigenvec, Eval_erf, Eval_erfc, Eval_exp, Eval_expand, Eval_expcos, Eval_expsin, Eval_factor, Eval_factorial, Eval_factorpoly, Eval_filter, Eval_float, Eval_floor, Eval_for, Eval_gamma, Eval_gcd, Eval_hermite, Eval_hilbert, Eval_imag, Eval_index, Eval_inner, Eval_integral, Eval_inv, Eval_invg, Eval_isinteger, Eval_isprime, Eval_laguerre, Eval_lcm, Eval_leading, Eval_legendre, Eval_log, Eval_mag, Eval_mod, Eval_multiply, Eval_noexpand, Eval_not, Eval_nroots, Eval_number, Eval_numerator, Eval_operator, Eval_or, Eval_outer, Eval_polar, Eval_power, Eval_predicate, Eval_prime, Eval_print, Eval_product, Eval_quote, Eval_quotient, Eval_rank, Eval_rationalize, Eval_real, Eval_rect, Eval_roots, Eval_setq, Eval_sgn, Eval_simfac, Eval_simplify, Eval_sin, Eval_sinh, Eval_sqrt, Eval_stop, Eval_subst, Eval_sym, Eval_tan, Eval_tanh, Eval_taylor, Eval_tensor, Eval_test, Eval_testeq, Eval_testge, Eval_testgt, Eval_testle, Eval_testlt, Eval_transpose, Eval_unit, Eval_user_function, Eval_zero, Evalpoly, FACTOR, FACTORIAL, FACTORPOLY, FILTER, FLOATF, FLOOR, FOR, Find, GAMMA, GCD, HERMITE, HILBERT, IMAG, INDEX, INNER, INTEGRAL, INV, INVG, INV_check_arg, INV_decomp, ISINTEGER, ISPRIME, LAGUERRE, LAST, LCM, LEADING, LEGENDRE, LOG, M, MAG, MAXDIM, MAXPRIMETAB, MAX_PROGRAM_SIZE, MEQUAL, METAA, METAB, METAX, MLENGTH, MOD, MP_MAX_FREE, MP_MIN_SIZE, MSIGN, MULTIPLY, MZERO, N, NIL, NOT, NROOTS, NROOTS_ABS, NROOTS_DELTA, NROOTS_EPSILON, NROOTS_RANDOM, NROOTS_YMAX, NROOTS_divpoly, NSYM, NUM, NUMBER, NUMERATOR, OPERATOR, OR, OUTER, PI, POLAR, POWER, PRIME, PRINT, PRINTOUTRESULT, PRODUCT, QUOTE, QUOTIENT, RANK, RATIONALIZE, REAL, ROOTS, SECRETX, SELFTEST, SETQ, SGN, SIMPLIFY, SIN, SINH, SPACE_BETWEEN_COLUMNS, SPACE_BETWEEN_ROWS, SQRT, STOP, STR, SUBST, SUM, SYM, SYMBOL_A, SYMBOL_B, SYMBOL_C, SYMBOL_D, SYMBOL_I, SYMBOL_J, SYMBOL_N, SYMBOL_R, SYMBOL_S, SYMBOL_T, SYMBOL_X, SYMBOL_Y, SYMBOL_Z, TAN, TANH, TAYLOR, TENSOR, TEST, TESTEQ, TESTGE, TESTGT, TESTLE, TESTLT, TOS, TRACE, TRANSPOSE, TTY, T_DOUBLE, T_EQ, T_FUNCTION, T_GTEQ, T_INTEGER, T_LTEQ, T_NEWLINE, T_STRING, T_SYMBOL, U, UNIT, USR_SYMBOLS, YMAX, YYE, YYRECT, ZERO, absval, absval_tensor, add, add_all, add_numbers, add_terms, addf, adj, alloc_tensor, allocatedId, any_denominators, arccos, arccosh, arcsin, arcsinh, arctan, arctanh, arg, arglist, bake, bake_poly, bake_poly_term, besselj, bessely, bigInt, bignum_factorial, bignum_float, bignum_power_number, bignum_scan_float, bignum_scan_integer, bignum_truncate, binding, binomial, buffer, build_tensor, caaddr, caadr, caar, cadaddr, cadadr, cadar, caddaddr, caddadr, caddar, caddddr, cadddr, caddr, cadr, car, cdaddr, cdadr, cdar, cddaddr, cddar, cdddaddr, cddddr, cdddr, cddr, cdr, ceil, ceiling, charTabIndex, chartab, check_esc_flag, check_stack, choose, choose_check_args, circexp, clear, clear_symbols, clear_term, clockform, cmpGlyphs, cmp_args, cmp_expr, cmp_terms, cmp_terms_count, coeff, cofactor, collectResultLine, combine_factors, combine_gammas, combine_terms, compare_numbers, compare_rationals, compare_tensors, compatible, compute_fa, conjugate, cons, consCount, contract, convert_bignum_to_double, convert_rational_to_double, copy_tensor, cosine, cosine_of_angle, cosine_of_angle_sum, count, count_denominators, counter, d_scalar_scalar, d_scalar_scalar_1, d_scalar_tensor, d_tensor_scalar, d_tensor_tensor, dabs, darccos, darccosh, darcsin, darcsinh, darctan, darctanh, dbesselj0, dbesseljn, dbessely0, dbesselyn, dcos, dcosh, dd, decomp, decomp_product, decomp_sum, define_user_function, defn, defn_str, degree, denominator, derf, derfc, derivative, derivative_of_integral, det, determinant, detg, dfunction, dhermite, dirac, display, display_flag, displaychar, divide, divide_numbers, divisors, divisors_onstack, divpoly, dlog, doubleToReasonableString, dpow, dpower, dproduct, draw_flag, draw_stop_return, dsgn, dsin, dsinh, dsum, dtan, dtanh, dupl, echo_input, eigen, elelmIndex, elem, emit_denominator, emit_denominators, emit_expr, emit_factor, emit_factorial_function, emit_flat_tensor, emit_fraction, emit_function, emit_index_function, emit_multiply, emit_number, emit_numerators, emit_numerical_fraction, emit_power, emit_string, emit_subexpr, emit_symbol, emit_tensor, emit_tensor_inner, emit_term, emit_top_expr, emit_unsigned_expr, emit_x, equal, equaln, equalq, erfc, error, errorMessage, esc_flag, expand, expand_get_A, expand_get_AF, expand_get_B, expand_get_C, expand_get_CF, expand_tensor, expanding, expcos, exponential, expr_level, expsin, f1, f2, f3, f4, f5, f9, f_equals_a, factor, factor_a, factor_again, factor_b, factor_number, factor_small_number, factor_term, factorial, factorpoly, factors, factpoly_expo, fill_buf, filter, filter_main, filter_sum, filter_tensor, findroot, fixup_fraction, fixup_power, flag, fmt_index, fmt_level, fmt_x, frame, free_stack, gamma, gamma_of_sum, gammaf, gcd, gcd_expr, gcd_expr_expr, gcd_factor_term, gcd_main, gcd_numbers, gcd_term_factor, gcd_term_term, gen, get_arglist, get_binding, get_factor, get_next_token, get_printname, get_size, get_token, getdisplaystr, glyph, gp, guess, hermite, hilbert, i, imag, imaginaryunit, index_function, init, initNRoots, inited, inner, inner_f, input_str, integral, integral_of_form, integral_of_product, integral_of_sum, inv, inverse, invert_number, invg, is_denominator, is_factor, is_small_integer, is_square_matrix, isadd, isalnum, isalpha, iscomplexnumber, iscons, isdenominator, isdigit, isdouble, iseveninteger, isfactor, isfactorial, isfloating, isfraction, isimaginarynumber, isimaginaryunit, isinteger, isintegerfactor, iskeyword, isminusone, isminusoneoversqrttwo, isnegative, isnegativenumber, isnegativeterm, isnonnegativeinteger, isnpi, isnum, isoneover, isoneoversqrttwo, isplusone, ispoly, ispoly_expr, ispoly_factor, ispoly_term, isposint, ispower, isquarterturn, isrational, isspace, isstr, issymbol, issymbolic, istensor, iszero, itab, j, laguerre, laguerre2, lcm, leading, legendre, length, lessp, level, list, logarithm, logbuf, lookupsTotal, lu_decomp, madd, mag, makePositive, makeSignSameAs, mask, mcmp, mcmpint, mdiv, mdivrem, meta_mode, mgcd, mini_solve, mint, mmod, mmul, mod, monic, move, mp_clr_bit, mp_denominator, mp_numerator, mp_set_bit, mpow, mprime, mroot, mshiftright, msub, mtotal, multinomial_sum, multiply, multiply_all, multiply_all_noexpand, multiply_denominators, multiply_denominators_factor, multiply_denominators_term, multiply_noexpand, multiply_numbers, n_factor_number, negate, negate_expand, negate_noexpand, negate_number, new_string, newline_flag, nil_symbols, normalize_angle, nroots_a, nroots_b, nroots_c, nroots_df, nroots_dx, nroots_fa, nroots_fb, nroots_x, nroots_y, nterms, numerator, numericRootOfPolynomial, one, oneElement, out_buf, out_count, out_of_memory, outer, p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, parse_p1, parse_p2, partition, peek, peek2, polar, polycoeff, polyform, pop, pop_double, pop_frame, pop_integer, power, power_str, power_sum, power_tensor, prime, primetab, print1, print_a_over_b, print_char, print_denom, print_double, print_expr, print_factor, print_factorial_function, print_it, print_multiply_sign, print_number, print_str, print_subexpr, print_tensor, print_tensor_inner, print_term, printchar, printchar_nowrap, printline, program_buf, promote_tensor, push, push_cars, push_double, push_factor, push_frame, push_identity_matrix, push_integer, push_rational, push_symbol, push_term_factors, push_terms, push_zero_matrix, qadd, qdiv, qmul, qpow, qpowf, quickfactor, quickpower, rational, rationalize, rationalize_coefficients, real, reciprocate, rect, remove_negative_exponents, restore, rewrite_args, rewrite_args_tensor, roots, roots2, roots3, run, save, scalar_times_tensor, scan, scan_expression, scan_factor, scan_function_call, scan_meta, scan_power, scan_relation, scan_stmt, scan_str, scan_string, scan_subexpr, scan_symbol, scan_term, scanned, setM, setSignTo, set_binding, set_binding_and_arglist, set_component, setq_indexed, sfac_product, sfac_product_f, sgn, sign, sign_of_term, simfac, simfac_term, simplify, simplify_main, simplify_polar, simplify_tensor, simplify_trig, simplifyfactorials, sine, sine_of_angle, sine_of_angle_sum, sort_stack, square, ssqrt, stack, stackAddsCount, std_symbol, step, step2, stop, strcmp, stringToBePrinted, subf, subst, subtract, subtract_numbers, swap, symbol, symnum, symtab, tangent, taylor, tensor, tensor_plus_tensor, tensor_times_scalar, test_flag, text_metric, theRandom, token, token_buf, token_str, top_level_eval, tos, transform, transpose, trigmode, trivial_divide, try_kth_prime, ucmp, unique, unique_f, update_token_buf, usr_symbol, verbosing, will_be_displayed_as_fraction, ybinomial, ycosh, ydirac, yerf, yerfc, yfloor, yindex, ysinh, yyarg, yybesselj, yybessely, yyceiling, yycondense, yycontract, yycosh, yydegree, yydetg, yydivpoly, yyerf, yyerfc, yyexpand, yyfactorpoly, yyfloat, yyfloor, yyhermite, yyhermite2, yyinvg, yylcm, yylog, yymag, yymultiply, yyouter, yypower, yyrationalize, yysgn, yysimfac, yysinh, yytangent, zero, __emit_char, __emit_str, __factor_add, __factorial, __is_negative, __is_radical_number, __legendre, __legendre2, __legendre3, __normalize_radical_factors, __rationalize_tensor, _i, _j, _k;
bigInt = require('big-integer');
SELFTEST = 1;
NSYM = 1000;
DEBUG = false;
PRINTOUTRESULT = false;
rational = (function() {
function rational() {}
rational.prototype.a = null;
rational.prototype.b = null;
return rational;
})();
U = (function() {
U.prototype.cons = null;
U.prototype.printname = "";
U.prototype.str = "";
U.prototype.tensor = null;
U.prototype.q = null;
U.prototype.d = 0.0;
U.prototype.k = 0;
U.prototype.tag = 0;
function U() {
this.cons = {};
this.cons.car = null;
this.cons.cdr = null;
this.q = new rational();
}
return U;
})();
errorMessage = "";
CONS = 0;
NUM = 1;
DOUBLE = 2;
STR = 3;
TENSOR = 4;
SYM = 5;
counter = 0;
ABS = counter++;
ADD = counter++;
ADJ = counter++;
AND = counter++;
ARCCOS = counter++;
ARCCOSH = counter++;
ARCSIN = counter++;
ARCSINH = counter++;
ARCTAN = counter++;
ARCTANH = counter++;
ARG = counter++;
ATOMIZE = counter++;
BESSELJ = counter++;
BESSELY = counter++;
BINDING = counter++;
BINOMIAL = counter++;
CEILING = counter++;
CHECK = counter++;
CHOOSE = counter++;
CIRCEXP = counter++;
CLEAR = counter++;
CLOCK = counter++;
COEFF = counter++;
COFACTOR = counter++;
CONDENSE = counter++;
CONJ = counter++;
CONTRACT = counter++;
COS = counter++;
COSH = counter++;
DECOMP = counter++;
DEFINT = counter++;
DEGREE = counter++;
DENOMINATOR = counter++;
DERIVATIVE = counter++;
DET = counter++;
DIM = counter++;
DIRAC = counter++;
DISPLAY = counter++;
DIVISORS = counter++;
DO = counter++;
DOT = counter++;
DRAW = counter++;
DSOLVE = counter++;
EIGEN = counter++;
EIGENVAL = counter++;
EIGENVEC = counter++;
ERF = counter++;
ERFC = counter++;
EVAL = counter++;
EXP = counter++;
EXPAND = counter++;
EXPCOS = counter++;
EXPSIN = counter++;
FACTOR = counter++;
FACTORIAL = counter++;
FACTORPOLY = counter++;
FILTER = counter++;
FLOATF = counter++;
FLOOR = counter++;
FOR = counter++;
GAMMA = counter++;
GCD = counter++;
HERMITE = counter++;
HILBERT = counter++;
IMAG = counter++;
INDEX = counter++;
INNER = counter++;
INTEGRAL = counter++;
INV = counter++;
INVG = counter++;
ISINTEGER = counter++;
ISPRIME = counter++;
LAGUERRE = counter++;
LCM = counter++;
LEADING = counter++;
LEGENDRE = counter++;
LOG = counter++;
MAG = counter++;
MOD = counter++;
MULTIPLY = counter++;
NOT = counter++;
NROOTS = counter++;
NUMBER = counter++;
NUMERATOR = counter++;
OPERATOR = counter++;
OR = counter++;
OUTER = counter++;
POLAR = counter++;
POWER = counter++;
PRIME = counter++;
PRINT = counter++;
PRODUCT = counter++;
QUOTE = counter++;
QUOTIENT = counter++;
RANK = counter++;
RATIONALIZE = counter++;
REAL = counter++;
YYRECT = counter++;
ROOTS = counter++;
SETQ = counter++;
SGN = counter++;
SIMPLIFY = counter++;
SIN = counter++;
SINH = counter++;
SQRT = counter++;
STOP = counter++;
SUBST = counter++;
SUM = counter++;
TAN = counter++;
TANH = counter++;
TAYLOR = counter++;
TEST = counter++;
TESTEQ = counter++;
TESTGE = counter++;
TESTGT = counter++;
TESTLE = counter++;
TESTLT = counter++;
TRANSPOSE = counter++;
UNIT = counter++;
ZERO = counter++;
NIL = counter++;
AUTOEXPAND = counter++;
BAKE = counter++;
LAST = counter++;
TRACE = counter++;
TTY = counter++;
YYE = counter++;
DRAWX = counter++;
METAA = counter++;
METAB = counter++;
METAX = counter++;
SECRETX = counter++;
PI = counter++;
SYMBOL_A = counter++;
SYMBOL_B = counter++;
SYMBOL_C = counter++;
SYMBOL_D = counter++;
SYMBOL_I = counter++;
SYMBOL_J = counter++;
SYMBOL_N = counter++;
SYMBOL_R = counter++;
SYMBOL_S = counter++;
SYMBOL_T = counter++;
SYMBOL_X = counter++;
SYMBOL_Y = counter++;
SYMBOL_Z = counter++;
C1 = counter++;
C2 = counter++;
C3 = counter++;
C4 = counter++;
C5 = counter++;
C6 = counter++;
USR_SYMBOLS = counter++;
E = YYE;
TOS = 100000;
BUF = 10000;
MAX_PROGRAM_SIZE = 100001;
MAXPRIMETAB = 10000;
primetab = [2];
i = 3;
while (primetab.length < MAXPRIMETAB) {
j = 0;
ceil = Math.sqrt(i);
while (j < primetab.length && primetab[j] <= ceil) {
if (i % primetab[j] === 0) {
j = -1;
break;
}
j++;
}
if (j !== -1) {
primetab.push(i);
}
i += 2;
}
MAXDIM = 24;
tensor = (function() {
tensor.prototype.ndim = 0;
tensor.prototype.dim = null;
tensor.prototype.nelem = 0;
tensor.prototype.elem = null;
function tensor() {
this.dim = (function() {
var _i, _results;
_results = [];
for (_i = 0; 0 <= MAXDIM ? _i <= MAXDIM : _i >= MAXDIM; 0 <= MAXDIM ? _i++ : _i--) {
_results.push(0);
}
return _results;
})();
this.elem = [];
}
return tensor;
})();
display = (function() {
function display() {}
display.prototype.h = 0;
display.prototype.w = 0;
display.prototype.n = 0;
display.prototype.a = [];
return display;
})();
text_metric = (function() {
function text_metric() {}
text_metric.prototype.ascent = 0;
text_metric.prototype.descent = 0;
text_metric.prototype.width = 0;
return text_metric;
})();
tos = 0;
expanding = 0;
fmt_x = 0;
fmt_index = 0;
fmt_level = 0;
verbosing = 0;
primetab = [];
primetab[MAXPRIMETAB] = 0;
esc_flag = 0;
draw_flag = 0;
mtotal = 0;
trigmode = 0;
logbuf = "";
program_buf = "";
symtab = [];
binding = [];
arglist = [];
stack = [];
frame = 0;
p0 = null;
p1 = null;
p2 = null;
p3 = null;
p4 = null;
p5 = null;
p6 = null;
p7 = null;
p8 = null;
p9 = null;
zero = null;
one = null;
imaginaryunit = null;
symtab = [];
out_buf = "";
out_count = 0;
test_flag = 0;
draw_stop_return = null;
symbol = function(x) {
return symtab[x];
};
iscons = function(p) {
return p.k === CONS;
};
isrational = function(p) {
return p.k === NUM;
};
isdouble = function(p) {
return p.k === DOUBLE;
};
isnum = function(p) {
return isrational(p) || isdouble(p);
};
isstr = function(p) {
return p.k === STR;
};
istensor = function(p) {
if (p == null) {
debugger;
} else {
return p.k === TENSOR;
}
};
issymbol = function(p) {
return p.k === SYM;
};
iskeyword = function(p) {
return issymbol(p) && symnum(p) < NIL;
};
car = function(p) {
if (iscons(p)) {
return p.cons.car;
} else {
return symbol(NIL);
}
};
cdr = function(p) {
if (iscons(p)) {
return p.cons.cdr;
} else {
return symbol(NIL);
}
};
caar = function(p) {
return car(car(p));
};
cadr = function(p) {
return car(cdr(p));
};
cdar = function(p) {
return cdr(car(p));
};
cddr = function(p) {
return cdr(cdr(p));
};
caadr = function(p) {
return car(car(cdr(p)));
};
caddr = function(p) {
return car(cdr(cdr(p)));
};
cadar = function(p) {
return car(cdr(car(p)));
};
cdadr = function(p) {
return cdr(car(cdr(p)));
};
cddar = function(p) {
return cdr(cdr(car(p)));
};
cdddr = function(p) {
return cdr(cdr(cdr(p)));
};
caaddr = function(p) {
return car(car(cdr(cdr(p))));
};
cadadr = function(p) {
return car(cdr(car(cdr(p))));
};
caddar = function(p) {
return car(cdr(cdr(car(p))));
};
cdaddr = function(p) {
return cdr(car(cdr(cdr(p))));
};
cadddr = function(p) {
return car(cdr(cdr(cdr(p))));
};
cddddr = function(p) {
return cdr(cdr(cdr(cdr(p))));
};
caddddr = function(p) {
return car(cdr(cdr(cdr(cdr(p)))));
};
cadaddr = function(p) {
return car(cdr(car(cdr(cdr(p)))));
};
cddaddr = function(p) {
return cdr(cdr(car(cdr(cdr(p)))));
};
caddadr = function(p) {
return car(cdr(cdr(car(cdr(p)))));
};
cdddaddr = function(p) {
return cdr(cdr(cdr(car(cdr(cdr(p))))));
};
caddaddr = function(p) {
return car(cdr(cdr(car(cdr(cdr(p))))));
};
isadd = function(p) {
return car(p) === symbol(ADD);
};
ispower = function(p) {
return car(p) === symbol(POWER);
};
isfactorial = function(p) {
return car(p) === symbol(FACTORIAL);
};
MSIGN = function(p) {
if (p.isPositive()) {
return 1;
} else if (p.isZero()) {
return 0;
} else {
return -1;
}
};
MLENGTH = function(p) {
return p.toString.length;
};
MZERO = function(p) {
return p.isZero();
};
MEQUAL = function(p, n) {
if (p == null) {
debugger;
}
return p.equals(n);
};
$ = typeof exports !== "undefined" && exports !== null ? exports : this;
$.car = car;
$.cdr = cdr;
$.symbol = symbol;
$.iscons = iscons;
$.isrational = isrational;
$.isdouble = isdouble;
$.isnum = isnum;
$.isstr = isstr;
$.istensor = istensor;
$.issymbol = issymbol;
$.iskeyword = iskeyword;
$.CONS = CONS;
$.NUM = NUM;
$.DOUBLE = DOUBLE;
$.STR = STR;
$.TENSOR = TENSOR;
$.SYM = SYM;
$.ABS = ABS;
$.ADD = ADD;
$.ADJ = ADJ;
$.AND = AND;
$.ARCCOS = ARCCOS;
$.ARCCOSH = ARCCOSH;
$.ARCSIN = ARCSIN;
$.ARCSINH = ARCSINH;
$.ARCTAN = ARCTAN;
$.ARCTANH = ARCTANH;
$.ARG = ARG;
$.ATOMIZE = ATOMIZE;
$.BESSELJ = BESSELJ;
$.BESSELY = BESSELY;
$.BINDING = BINDING;
$.BINOMIAL = BINOMIAL;
$.CEILING = CEILING;
$.CHECK = CHECK;
$.CHOOSE = CHOOSE;
$.CIRCEXP = CIRCEXP;
$.CLEAR = CLEAR;
$.CLOCK = CLOCK;
$.COEFF = COEFF;
$.COFACTOR = COFACTOR;
$.CONDENSE = CONDENSE;
$.CONJ = CONJ;
$.CONTRACT = CONTRACT;
$.COS = COS;
$.COSH = COSH;
$.DECOMP = DECOMP;
$.DEFINT = DEFINT;
$.DEGREE = DEGREE;
$.DENOMINATOR = DENOMINATOR;
$.DERIVATIVE = DERIVATIVE;
$.DET = DET;
$.DIM = DIM;
$.DIRAC = DIRAC;
$.DISPLAY = DISPLAY;
$.DIVISORS = DIVISORS;
$.DO = DO;
$.DOT = DOT;
$.DRAW = DRAW;
$.DSOLVE = DSOLVE;
$.EIGEN = EIGEN;
$.EIGENVAL = EIGENVAL;
$.EIGENVEC = EIGENVEC;
$.ERF = ERF;
$.ERFC = ERFC;
$.EVAL = EVAL;
$.EXP = EXP;
$.EXPAND = EXPAND;
$.EXPCOS = EXPCOS;
$.EXPSIN = EXPSIN;
$.FACTOR = FACTOR;
$.FACTORIAL = FACTORIAL;
$.FACTORPOLY = FACTORPOLY;
$.FILTER = FILTER;
$.FLOATF = FLOATF;
$.FLOOR = FLOOR;
$.FOR = FOR;
$.GAMMA = GAMMA;
$.GCD = GCD;
$.HERMITE = HERMITE;
$.HILBERT = HILBERT;
$.IMAG = IMAG;
$.INDEX = INDEX;
$.INNER = INNER;
$.INTEGRAL = INTEGRAL;
$.INV = INV;
$.INVG = INVG;
$.ISINTEGER = ISINTEGER;
$.ISPRIME = ISPRIME;
$.LAGUERRE = LAGUERRE;
$.LCM = LCM;
$.LEADING = LEADING;
$.LEGENDRE = LEGENDRE;
$.LOG = LOG;
$.MAG = MAG;
$.MOD = MOD;
$.MULTIPLY = MULTIPLY;
$.NOT = NOT;
$.NROOTS = NROOTS;
$.NUMBER = NUMBER;
$.NUMERATOR = NUMERATOR;
$.OPERATOR = OPERATOR;
$.OR = OR;
$.OUTER = OUTER;
$.POLAR = POLAR;
$.POWER = POWER;
$.PRIME = PRIME;
$.PRINT = PRINT;
$.PRODUCT = PRODUCT;
$.QUOTE = QUOTE;
$.QUOTIENT = QUOTIENT;
$.RANK = RANK;
$.RATIONALIZE = RATIONALIZE;
$.REAL = REAL;
$.YYRECT = YYRECT;
$.ROOTS = ROOTS;
$.SETQ = SETQ;
$.SGN = SGN;
$.SIMPLIFY = SIMPLIFY;
$.SIN = SIN;
$.SINH = SINH;
$.SQRT = SQRT;
$.STOP = STOP;
$.SUBST = SUBST;
$.SUM = SUM;
$.TAN = TAN;
$.TANH = TANH;
$.TAYLOR = TAYLOR;
$.TEST = TEST;
$.TESTEQ = TESTEQ;
$.TESTGE = TESTGE;
$.TESTGT = TESTGT;
$.TESTLE = TESTLE;
$.TESTLT = TESTLT;
$.TRANSPOSE = TRANSPOSE;
$.UNIT = UNIT;
$.ZERO = ZERO;
$.NIL = NIL;
$.AUTOEXPAND = AUTOEXPAND;
$.BAKE = BAKE;
$.LAST = LAST;
$.TRACE = TRACE;
$.TTY = TTY;
$.YYE = YYE;
$.DRAWX = DRAWX;
$.METAA = METAA;
$.METAB = METAB;
$.METAX = METAX;
$.SECRETX = SECRETX;
$.PI = PI;
$.SYMBOL_A = SYMBOL_A;
$.SYMBOL_B = SYMBOL_B;
$.SYMBOL_C = SYMBOL_C;
$.SYMBOL_D = SYMBOL_D;
$.SYMBOL_I = SYMBOL_I;
$.SYMBOL_J = SYMBOL_J;
$.SYMBOL_N = SYMBOL_N;
$.SYMBOL_R = SYMBOL_R;
$.SYMBOL_S = SYMBOL_S;
$.SYMBOL_T = SYMBOL_T;
$.SYMBOL_X = SYMBOL_X;
$.SYMBOL_Y = SYMBOL_Y;
$.SYMBOL_Z = SYMBOL_Z;
$.C1 = C1;
$.C2 = C2;
$.C3 = C3;
$.C4 = C4;
$.C5 = C5;
$.C6 = C6;
$.USR_SYMBOLS = USR_SYMBOLS;
/*
// up to 100 blocks of 100,000 atoms
#define M 100
#define N 100000
U *mem[M]
int mcount
U *free_list
int free_count
U *
alloc(void)
{
U *p
if (free_count == 0) {
if (mcount == 0)
alloc_mem()
else {
gc()
if (free_count < N * mcount / 2)
alloc_mem()
}
if (free_count == 0)
stop("atom space exhausted")
}
p = free_list
free_list = free_list->u.cons.cdr
free_count--
return p
}
*/
allocatedId = 0;
alloc_tensor = function(nelem) {
var p, _i;
i = 0;
p = new U();
p.k = TENSOR;
p.tensor = new tensor();
p.tensor.nelem = nelem;
for (i = _i = 0; 0 <= nelem ? _i < nelem : _i > nelem; i = 0 <= nelem ? ++_i : --_i) {
p.tensor.elem[i] = zero;
}
p.tensor.allocatedId = allocatedId;
allocatedId++;
if (p.tensor.nelem !== p.tensor.elem.length) {
console.log("something wrong in tensor dimensions");
debugger;
}
return p;
};
/*
// garbage collector
void
gc(void)
{
int i, j
U *p
// tag everything
for (i = 0; i < mcount; i++) {
p = mem[i]
for (j = 0; j < N; j++)
p[j].tag = 1
}
// untag what's used
untag(p0)
untag(p1)
untag(p2)
untag(p3)
untag(p4)
untag(p5)
untag(p6)
untag(p7)
untag(p8)
untag(p9)
untag(one)
untag(zero)
untag(imaginaryunit)
for (i = 0; i < NSYM; i++) {
untag(binding[i])
untag(arglist[i])
}
for (i = 0; i < tos; i++)
untag(stack[i])
for (i = (int) (frame - stack); i < TOS; i++)
untag(stack[i])
// collect everything that's still tagged
free_count = 0
for (i = 0; i < mcount; i++) {
p = mem[i]
for (j = 0; j < N; j++) {
if (p[j].tag == 0)
continue
// still tagged so it's unused, put on free list
switch (p[j].k) {
case TENSOR:
free(p[j].u.tensor)
break
case STR:
free(p[j].u.str)
break
case NUM:
mfree(p[j].u.q.a)
mfree(p[j].u.q.b)
break
}
p[j].k = CONS; // so no double free occurs above
p[j].u.cons.cdr = free_list
free_list = p + j
free_count++
}
}
}
void
untag(U *p)
{
int i
if (iscons(p)) {
do {
if (p->tag == 0)
return
p->tag = 0
untag(p->u.cons.car)
p = p->u.cons.cdr
} while (iscons(p))
untag(p)
return
}
if (p->tag) {
p->tag = 0
if (istensor(p)) {
for (i = 0; i < p->u.tensor->nelem; i++)
untag(p->u.tensor->elem[i])
}
}
}
// get memory for 100,000 atoms
void
alloc_mem(void)
{
int i
U *p
if (mcount == M)
return
p = (U *) malloc(N * sizeof (struct U))
if (p == NULL)
return
mem[mcount++] = p
for (i = 0; i < N; i++) {
p[i].k = CONS; // so no free in gc
p[i].u.cons.cdr = p + i + 1
}
p[N - 1].u.cons.cdr = free_list
free_list = p
free_count += N
}
void
print_mem_info(void)
{
char buf[100]
sprintf(buf, "%d blocks (%d bytes/block)\n", N * mcount, (int) sizeof (U))
printstr(buf)
sprintf(buf, "%d free\n", free_count)
printstr(buf)
sprintf(buf, "%d used\n", N * mcount - free_count)
printstr(buf)
}
*/
YMAX = 10000;
glyph = (function() {
function glyph() {}
glyph.prototype.c = 0;
glyph.prototype.x = 0;
glyph.prototype.y = 0;
return glyph;
})();
chartab = [];
for (charTabIndex = _i = 0; 0 <= YMAX ? _i < YMAX : _i > YMAX; charTabIndex = 0 <= YMAX ? ++_i : --_i) {
chartab[charTabIndex] = new glyph();
}
yindex = 0;
level = 0;
emit_x = 0;
expr_level = 0;
display_flag = 0;
printchar_nowrap = function(character, accumulator) {
var topLevelCall;
if (accumulator == null) {
topLevelCall = true;
accumulator = "";
}
accumulator += character;
return accumulator;
};
printchar = function(character, accumulator) {
return printchar_nowrap(character, accumulator);
};
display = function(p) {
var h, w, y, _ref;
h = 0;
w = 0;
y = 0;
save();
yindex = 0;
level = 0;
emit_x = 0;
emit_top_expr(p);
_ref = get_size(0, yindex), h = _ref[0], w = _ref[1], y = _ref[2];
if (w > 100) {
printline(p);
restore();
return;
}
print_it();
return restore();
};
emit_top_expr = function(p) {
if (car(p) === symbol(SETQ)) {
emit_expr(cadr(p));
__emit_str(" = ");
emit_expr(caddr(p));
return;
}
if (istensor(p)) {
return emit_tensor(p);
} else {
return emit_expr(p);
}
};
will_be_displayed_as_fraction = function(p) {
if (level > 0) {
return 0;
}
if (isfraction(p)) {
return 1;
}
if (car(p) !== symbol(MULTIPLY)) {
return 0;
}
if (isfraction(cadr(p))) {
return 1;
}
while (iscons(p)) {
if (isdenominator(car(p))) {
return 1;
}
p = cdr(p);
}
return 0;
};
emit_expr = function(p) {
expr_level++;
if (car(p) === symbol(ADD)) {
p = cdr(p);
if (__is_negative(car(p))) {
__emit_char('-');
if (will_be_displayed_as_fraction(car(p))) {
__emit_char(' ');
}
}
emit_term(car(p));
p = cdr(p);
while (iscons(p)) {
if (__is_negative(car(p))) {
__emit_char(' ');
__emit_char('-');
__emit_char(' ');
} else {
__emit_char(' ');
__emit_char('+');
__emit_char(' ');
}
emit_term(car(p));
p = cdr(p);
}
} else {
if (__is_negative(p)) {
__emit_char('-');
if (will_be_displayed_as_fraction(p)) {
__emit_char(' ');
}
}
emit_term(p);
}
return expr_level--;
};
emit_unsigned_expr = function(p) {
var _results;
if (car(p) === symbol(ADD)) {
p = cdr(p);
emit_term(car(p));
p = cdr(p);
_results = [];
while (iscons(p)) {
if (__is_negative(car(p))) {
__emit_char(' ');
__emit_char('-');
__emit_char(' ');
} else {
__emit_char(' ');
__emit_char('+');
__emit_char(' ');
}
emit_term(car(p));
_results.push(p = cdr(p));
}
return _results;
} else {
return emit_term(p);
}
};
__is_negative = function(p) {
if (isnegativenumber(p)) {
return 1;
}
if (car(p) === symbol(MULTIPLY) && isnegativenumber(cadr(p))) {
return 1;
}
return 0;
};
emit_term = function(p) {
var n;
if (car(p) === symbol(MULTIPLY)) {
n = count_denominators(p);
if (n && level === 0) {
return emit_fraction(p, n);
} else {
return emit_multiply(p, n);
}
} else {
return emit_factor(p);
}
};
isdenominator = function(p) {
if (car(p) === symbol(POWER) && cadr(p) !== symbol(E) && __is_negative(caddr(p))) {
return 1;
} else {
return 0;
}
};
count_denominators = function(p) {
var count, q;
count = 0;
p = cdr(p);
while (iscons(p)) {
q = car(p);
if (isdenominator(q)) {
count++;
}
p = cdr(p);
}
return count;
};
emit_multiply = function(p, n) {
var _results;
if (n === 0) {
p = cdr(p);
if (isplusone(car(p)) || isminusone(car(p))) {
p = cdr(p);
}
emit_factor(car(p));
p = cdr(p);
_results = [];
while (iscons(p)) {
__emit_char(' ');
emit_factor(car(p));
_results.push(p = cdr(p));
}
return _results;
} else {
emit_numerators(p);
__emit_char('/');
if (n > 1 || isfraction(cadr(p))) {
__emit_char('(');
emit_denominators(p);
return __emit_char(')');
} else {
return emit_denominators(p);
}
}
};
emit_fraction = function(p, d) {
var count, doNothing, k1, k2, n, x;
count = 0;
k1 = 0;
k2 = 0;
n = 0;
x = 0;
save();
p3 = one;
p4 = one;
if (isrational(cadr(p))) {
push(cadr(p));
mp_numerator();
absval();
p3 = pop();
push(cadr(p));
mp_denominator();
p4 = pop();
}
if (isdouble(cadr(p))) {
push(cadr(p));
absval();
p3 = pop();
}
if (isplusone(p3)) {
n = 0;
} else {
n = 1;
}
p1 = cdr(p);
if (isnum(car(p1))) {
p1 = cdr(p1);
}
while (iscons(p1)) {
p2 = car(p1);
if (isdenominator(p2)) {
doNothing = 1;
} else {
n++;
}
p1 = cdr(p1);
}
x = emit_x;
k1 = yindex;
count = 0;
if (!isplusone(p3)) {
emit_number(p3, 0);
count++;
}
p1 = cdr(p);
if (isnum(car(p1))) {
p1 = cdr(p1);
}
while (iscons(p1)) {
p2 = car(p1);
if (isdenominator(p2)) {
doNothing = 1;
} else {
if (count > 0) {
__emit_char(' ');
}
if (n === 1) {
emit_expr(p2);
} else {
emit_factor(p2);
}
count++;
}
p1 = cdr(p1);
}
if (count === 0) {
__emit_char('1');
}
k2 = yindex;
count = 0;
if (!isplusone(p4)) {
emit_number(p4, 0);
count++;
d++;
}
p1 = cdr(p);
if (isrational(car(p1))) {
p1 = cdr(p1);
}
while (iscons(p1)) {
p2 = car(p1);
if (isdenominator(p2)) {
if (count > 0) {
__emit_char(' ');
}
emit_denominator(p2, d);
count++;
}
p1 = cdr(p1);
}
fixup_fraction(x, k1, k2);
return restore();
};
emit_numerators = function(p) {
var doNothing, n;
int(n);
save();
p1 = one;
p = cdr(p);
if (isrational(car(p))) {
push(car(p));
mp_numerator();
absval();
p1 = pop();
p = cdr(p);
} else if (isdouble(car(p))) {
push(car(p));
absval();
p1 = pop();
p = cdr(p);
}
n = 0;
if (!isplusone(p1)) {
emit_number(p1, 0);
n++;
}
while (iscons(p)) {
if (isdenominator(car(p))) {
doNothing = 1;
} else {
if (n > 0) {
__emit_char(' ');
}
emit_factor(car(p));
n++;
}
p = cdr(p);
}
if (n === 0) {
__emit_char('1');
}
return restore();
};
emit_denominators = function(p) {
var n;
int(n);
save();
n = 0;
p = cdr(p);
if (isfraction(car(p))) {
push(car(p));
mp_denominator();
p1 = pop();
emit_number(p1, 0);
n++;
p = cdr(p);
}
while (iscons(p)) {
if (isdenominator(car(p))) {
if (n > 0) {
__emit_char(' ');
}
emit_denominator(car(p), 0);
n++;
}
p = cdr(p);
}
return restore();
};
emit_factor = function(p) {
if (istensor(p)) {
if (level === 0) {
emit_flat_tensor(p);
} else {
emit_flat_tensor(p);
}
return;
}
if (isdouble(p)) {
emit_number(p, 0);
return;
}
if (car(p) === symbol(ADD) || car(p) === symbol(MULTIPLY)) {
emit_subexpr(p);
return;
}
if (car(p) === symbol(POWER)) {
emit_power(p);
return;
}
if (iscons(p)) {
emit_function(p);
return;
}
if (isnum(p)) {
if (level === 0) {
emit_numerical_fraction(p);
} else {
emit_number(p, 0);
}
return;
}
if (issymbol(p)) {
emit_symbol(p);
return;
}
if (isstr(p)) {
emit_string(p);
}
};
emit_numerical_fraction = function(p) {
var k1, k2, x;
k1 = 0;
k2 = 0;
x = 0;
save();
push(p);
mp_numerator();
absval();
p3 = pop();
push(p);
mp_denominator();
p4 = pop();
if (isplusone(p4)) {
emit_number(p3, 0);
restore();
return;
}
x = emit_x;
k1 = yindex;
emit_number(p3, 0);
k2 = yindex;
emit_number(p4, 0);
fixup_fraction(x, k1, k2);
return restore();
};
isfactor = function(p) {
if (iscons(p) && car(p) !== symbol(ADD) && car(p) !== symbol(MULTIPLY) && car(p) !== symbol(POWER)) {
return 1;
}
if (issymbol(p)) {
return 1;
}
if (isfraction(p)) {
return 0;
}
if (isnegativenumber(p)) {
return 0;
}
if (isnum(p)) {
return 1;
}
return 0;
};
emit_power = function(p) {
var k1, k2, x;
k1 = 0;
k2 = 0;
x = 0;
if (cadr(p) === symbol(E)) {
__emit_str("exp(");
emit_expr(caddr(p));
__emit_char(')');
return;
}
if (level > 0) {
if (isminusone(caddr(p))) {
__emit_char('1');
__emit_char('/');
if (isfactor(cadr(p))) {
emit_factor(cadr(p));
} else {
emit_subexpr(cadr(p));
}
} else {
if (isfactor(cadr(p))) {
emit_factor(cadr(p));
} else {
emit_subexpr(cadr(p));
}
__emit_char('^');
if (isfactor(caddr(p))) {
emit_factor(caddr(p));
} else {
emit_subexpr(caddr(p));
}
}
return;
}
if (__is_negative(caddr(p))) {
x = emit_x;
k1 = yindex;
__emit_char('1');
k2 = yindex;
emit_denominator(p, 1);
fixup_fraction(x, k1, k2);
return;
}
k1 = yindex;
if (isfactor(cadr(p))) {
emit_factor(cadr(p));
} else {
emit_subexpr(cadr(p));
}
k2 = yindex;
level++;
emit_expr(caddr(p));
level--;
return fixup_power(k1, k2);
};
emit_denominator = function(p, n) {
var k1, k2;
k1 = 0;
k2 = 0;
if (isminusone(caddr(p))) {
if (n === 1) {
emit_expr(cadr(p));
} else {
emit_factor(cadr(p));
}
return;
}
k1 = yindex;
if (isfactor(cadr(p))) {
emit_factor(cadr(p));
} else {
emit_subexpr(cadr(p));
}
k2 = yindex;
level++;
emit_unsigned_expr(caddr(p));
level--;
return fixup_power(k1, k2);
};
emit_function = function(p) {
if (car(p) === symbol(INDEX) && issymbol(cadr(p))) {
emit_index_function(p);
return;
}
if (car(p) === symbol(FACTORIAL)) {
emit_factorial_function(p);
return;
}
if (car(p) === symbol(DERIVATIVE)) {
__emit_char('d');
} else {
emit_symbol(car(p));
}
__emit_char('(');
p = cdr(p);
if (iscons(p)) {
emit_expr(car(p));
p = cdr(p);
while (iscons(p)) {
__emit_char(',');
emit_expr(car(p));
p = cdr(p);
}
}
return __emit_char(')');
};
emit_index_function = function(p) {
p = cdr(p);
if (caar(p) === symbol(ADD) || caar(p) === symbol(MULTIPLY) || caar(p) === symbol(POWER) || caar(p) === symbol(FACTORIAL)) {
emit_subexpr(car(p));
} else {
emit_expr(car(p));
}
__emit_char('[');
p = cdr(p);
if (iscons(p)) {
emit_expr(car(p));
p = cdr(p);
while (iscons(p)) {
__emit_char(',');
emit_expr(car(p));
p = cdr(p);
}
}
return __emit_char(']');
};
emit_factorial_function = function(p) {
p = cadr(p);
if (car(p) === symbol(ADD) || car(p) === symbol(MULTIPLY) || car(p) === symbol(POWER) || car(p) === symbol(FACTORIAL)) {
emit_subexpr(p);
} else {
emit_expr(p);
}
return __emit_char('!');
};
emit_subexpr = function(p) {
__emit_char('(');
emit_expr(p);
return __emit_char(')');
};
emit_symbol = function(p) {
var pPrintName, _j, _ref, _results;
i = 0;
if (p === symbol(E)) {
__emit_str("exp(1)");
return;
}
pPrintName = get_printname(p);
_results = [];
for (i = _j = 0, _ref = pPrintName.length; 0 <= _ref ? _j < _ref : _j > _ref; i = 0 <= _ref ? ++_j : --_j) {
_results.push(__emit_char(pPrintName[i]));
}
return _results;
};
emit_string = function(p) {
var pString, _j, _ref, _results;
i = 0;
pString = p.str;
_results = [];
for (i = _j = 0, _ref = pString.length; 0 <= _ref ? _j < _ref : _j > _ref; i = 0 <= _ref ? ++_j : --_j) {
_results.push(__emit_char(pString[i]));
}
return _results;
};
fixup_fraction = function(x, k1, k2) {
var dx, dy, h1, h2, w, w1, w2, y, y1, y2, _j, _ref, _ref1, _results;
dx = 0;
dy = 0;
i = 0;
w = 0;
y = 0;
h1 = 0;
w1 = 0;
y1 = 0;
h2 = 0;
w2 = 0;
y2 = 0;
_ref = get_size(k1, k2), h1 = _ref[0], w1 = _ref[1], y1 = _ref[2];
_ref1 = get_size(k2, yindex), h2 = _ref1[0], w2 = _ref1[1], y2 = _ref1[2];
if (w2 > w1) {
dx = (w2 - w1) / 2;
} else {
dx = 0;
}
dx++;
y = y1 + h1 - 1;
dy = -y - 1;
move(k1, k2, dx, dy);
if (w2 > w1) {
dx = -w1;
} else {
dx = -w1 + (w1 - w2) / 2;
}
dx++;
dy = -y2 + 1;
move(k2, yindex, dx, dy);
if (w2 > w1) {
w = w2;
} else {
w = w1;
}
w += 2;
emit_x = x;
_results = [];
for (i = _j = 0; 0 <= w ? _j < w : _j > w; i = 0 <= w ? ++_j : --_j) {
_results.push(__emit_char('-'));
}
return _results;
};
fixup_power = function(k1, k2) {
var dy, h1, h2, w1, w2, y1, y2, _ref, _ref1;
dy = 0;
h1 = 0;
w1 = 0;
y1 = 0;
h2 = 0;
w2 = 0;
y2 = 0;
_ref = get_size(k1, k2), h1 = _ref[0], w1 = _ref[1], y1 = _ref[2];
_ref1 = get_size(k2, yindex), h2 = _ref1[0], w2 = _ref1[1], y2 = _ref1[2];
dy = -y2 - h2 + 1;
dy += y1 - 1;
return move(k2, yindex, 0, dy);
};
move = function(j, k, dx, dy) {
var _j, _results;
i = 0;
_results = [];
for (i = _j = j; j <= k ? _j < k : _j > k; i = j <= k ? ++_j : --_j) {
chartab[i].x += dx;
_results.push(chartab[i].y += dy);
}
return _results;
};
get_size = function(j, k) {
var h, max_x, max_y, min_x, min_y, w, y, _j, _ref;
i = 0;
min_x = chartab[j].x;
max_x = chartab[j].x;
min_y = chartab[j].y;
max_y = chartab[j].y;
for (i = _j = _ref = j + 1; _ref <= k ? _j < k : _j > k; i = _ref <= k ? ++_j : --_j) {
if (chartab[i].x < min_x) {
min_x = chartab[i].x;
}
if (chartab[i].x > max_x) {
max_x = chartab[i].x;
}
if (chartab[i].y < min_y) {
min_y = chartab[i].y;
}
if (chartab[i].y > max_y) {
max_y = chartab[i].y;
}
}
h = max_y - min_y + 1;
w = max_x - min_x + 1;
y = min_y;
return [h, w, y];
};
displaychar = function(c) {
return __emit_char(c);
};
__emit_char = function(c) {
if (yindex === YMAX) {
return;
}
if (chartab[yindex] == null) {
debugger;
}
chartab[yindex].c = c;
chartab[yindex].x = emit_x;
chartab[yindex].y = 0;
yindex++;
return emit_x++;
};
__emit_str = function(s) {
var _j, _ref, _results;
i = 0;
_results = [];
for (i = _j = 0, _ref = s.length; 0 <= _ref ? _j < _ref : _j > _ref; i = 0 <= _ref ? ++_j : --_j) {
_results.push(__emit_char(s[i]));
}
return _results;
};
emit_number = function(p, emit_sign) {
var tmpString, _j, _k, _l, _ref, _ref1, _ref2, _results, _results1;
tmpString = "";
i = 0;
switch (p.k) {
case NUM:
tmpString = p.q.a.toString();
if (tmpString[0] === '-' && emit_sign === 0) {
tmpString = tmpString.substring(1);
}
for (i = _j = 0, _ref = tmpString.length; 0 <= _ref ? _j < _ref : _j > _ref; i = 0 <= _ref ? ++_j : --_j) {
__emit_char(tmpString[i]);
}
tmpString = p.q.b.toString();
if (tmpString === "1") {
break;
}
__emit_char('/');
_results = [];
for (i = _k = 0, _ref1 = tmpString.length; 0 <= _ref1 ? _k < _ref1 : _k > _ref1; i = 0 <= _ref1 ? ++_k : --_k) {
_results.push(__emit_char(tmpString[i]));
}
return _results;
break;
case DOUBLE:
tmpString = doubleToReasonableString(p.d);
if (tmpString[0] === '-' && emit_sign === 0) {
tmpString = tmpString.substring(1);
}
_results1 = [];
for (i = _l = 0, _ref2 = tmpString.length; 0 <= _ref2 ? _l < _ref2 : _l > _ref2; i = 0 <= _ref2 ? ++_l : --_l) {
_results1.push(__emit_char(tmpString[i]));
}
return _results1;
}
};
cmpGlyphs = function(a, b) {
if (a.y < b.y) {
return -1;
}
if (a.y > b.y) {
return 1;
}
if (a.x < b.x) {
return -1;
}
if (a.x > b.x) {
return 1;
}
return 0;
};
print_it = function() {
var accumulatedPrint, subsetOfStack, x, y, _j;
i = 0;
accumulatedPrint = "";
subsetOfStack = chartab.slice(0, yindex);
subsetOfStack.sort(cmpGlyphs);
chartab = [].concat(subsetOfStack).concat(chartab.slice(yindex));
x = 0;
y = chartab[0].y;
for (i = _j = 0; 0 <= yindex ? _j < yindex : _j > yindex; i = 0 <= yindex ? ++_j : --_j) {
while (chartab[i].y > y) {
accumulatedPrint = printchar('\n', accumulatedPrint);
x = 0;
y++;
}
while (chartab[i].x > x) {
accumulatedPrint = printchar_nowrap(' ', accumulatedPrint);
x++;
}
accumulatedPrint = printchar_nowrap(chartab[i].c, accumulatedPrint);
x++;
}
if (PRINTOUTRESULT) {
return console.log(accumulatedPrint);
}
};
buffer = "";
getdisplaystr = function() {
yindex = 0;
level = 0;
emit_x = 0;
emit_expr(pop());
fill_buf();
return buffer;
};
fill_buf = function() {
var sIndex, subsetOfStack, tmpBuffer, x, y, _j;
tmpBuffer = buffer;
sIndex = 0;
i = 0;
subsetOfStack = chartab.slice(0, yindex);
subsetOfStack.sort(cmpGlyphs);
chartab = [].concat(subsetOfStack).concat(chartab.slice(yindex));
x = 0;
y = chartab[0].y;
for (i = _j = 0; 0 <= yindex ? _j < yindex : _j > yindex; i = 0 <= yindex ? ++_j : --_j) {
while (chartab[i].y > y) {
tmpBuffer[sIndex++] = '\n';
x = 0;
y++;
}
while (chartab[i].x > x) {
tmpBuffer[sIndex++] = ' ';
x++;
}
tmpBuffer[sIndex++] = chartab[i].c;
x++;
}
return tmpBuffer[sIndex++] = '\n';
};
N = 100;
oneElement = (function() {
function oneElement() {}
oneElement.prototype.x = 0;
oneElement.prototype.y = 0;
oneElement.prototype.h = 0;
oneElement.prototype.w = 0;
oneElement.prototype.index = 0;
oneElement.prototype.count = 0;
return oneElement;
})();
elem = [];
for (elelmIndex = _j = 0; _j < 10000; elelmIndex = ++_j) {
elem[elelmIndex] = new oneElement;
}
SPACE_BETWEEN_COLUMNS = 3;
SPACE_BETWEEN_ROWS = 1;
emit_tensor = function(p) {
var col, dx, dy, eh, ew, h, n, ncol, nrow, row, w, x, y, _k, _l, _m, _n, _ref;
i = 0;
n = 0;
nrow = 0;
ncol = 0;
x = 0;
y = 0;
h = 0;
w = 0;
dx = 0;
dy = 0;
eh = 0;
ew = 0;
row = 0;
col = 0;
if (p.tensor.ndim > 2) {
emit_flat_tensor(p);
return;
}
nrow = p.tensor.dim[0];
if (p.tensor.ndim === 2) {
ncol = p.tensor.dim[1];
} else {
ncol = 1;
}
n = nrow * ncol;
if (n > N) {
emit_flat_tensor(p);
return;
}
x = emit_x;
for (i = _k = 0; 0 <= n ? _k < n : _k > n; i = 0 <= n ? ++_k : --_k) {
elem[i].index = yindex;
elem[i].x = emit_x;
emit_expr(p.tensor.elem[i]);
elem[i].count = yindex - elem[i].index;
_ref = get_size(elem[i].index, yindex), elem[i].h = _ref[0], elem[i].w = _ref[1], elem[i].y = _ref[2];
}
eh = 0;
ew = 0;
for (i = _l = 0; 0 <= n ? _l < n : _l > n; i = 0 <= n ? ++_l : --_l) {
if (elem[i].h > eh) {
eh = elem[i].h;
}
if (elem[i].w > ew) {
ew = elem[i].w;
}
}
h = nrow * eh + (nrow - 1) * SPACE_BETWEEN_ROWS;
w = ncol * ew + (ncol - 1) * SPACE_BETWEEN_COLUMNS;
y = -(h / 2);
for (row = _m = 0; 0 <= nrow ? _m < nrow : _m > nrow; row = 0 <= nrow ? ++_m : --_m) {
for (col = _n = 0; 0 <= ncol ? _n < ncol : _n > ncol; col = 0 <= ncol ? ++_n : --_n) {
i = row * ncol + col;
dx = x - elem[i].x;
dy = y - elem[i].y;
move(elem[i].index, elem[i].index + elem[i].count, dx, dy);
dx = 0;
if (col > 0) {
dx = col * (ew + SPACE_BETWEEN_COLUMNS);
}
dy = 0;
if (row > 0) {
dy = row * (eh + SPACE_BETWEEN_ROWS);
}
dx += (ew - elem[i].w) / 2;
dy += (eh - elem[i].h) / 2;
move(elem[i].index, elem[i].index + elem[i].count, dx, dy);
}
}
return emit_x = x + w;
/*
if 0
* left brace
for (i = 0; i < h; i++) {
if (yindex == YMAX)
break
chartab[yindex].c = '|'
chartab[yindex].x = x - 2
chartab[yindex].y = y + i
yindex++
}
* right brace
emit_x++
for (i = 0; i < h; i++) {
if (yindex == YMAX)
break
chartab[yindex].c = '|'
chartab[yindex].x = emit_x
chartab[yindex].y = y + i
yindex++
}
emit_x++
endif
*/
};
emit_flat_tensor = function(p) {
return emit_tensor_inner(p, 0, 0);
};
emit_tensor_inner = function(p, j, k) {
var _k, _ref;
i = 0;
__emit_char('(');
for (i = _k = 0, _ref = p.tensor.dim[j]; 0 <= _ref ? _k < _ref : _k > _ref; i = 0 <= _ref ? ++_k : --_k) {
if (j + 1 === p.tensor.ndim) {
emit_expr(p.tensor.elem[k]);
k = k + 1;
} else {
k = emit_tensor_inner(p, j + 1, k);
}
if (i + 1 < p.tensor.dim[j]) {
__emit_char(',');
}
}
__emit_char(')');
return k;
};
/*
void
test_display(void)
{
test(__FILE__, s, sizeof s / sizeof (char *))
}
#endif
*/
Find = function(p, q) {
var _k, _ref;
i = 0;
if (equal(p, q)) {
return 1;
}
if (istensor(p)) {
for (i = _k = 0, _ref = p.tensor.nelem; 0 <= _ref ? _k < _ref : _k > _ref; i = 0 <= _ref ? ++_k : --_k) {
if (Find(p.tensor.elem[i], q)) {
return 1;
}
}
return 0;
}
while (iscons(p)) {
if (Find(car(p), q)) {
return 1;
}
p = cdr(p);
}
return 0;
};
init = function() {
var flag, _k, _l;
i = 0;
flag = 0;
tos = 0;
esc_flag = 0;
draw_flag = 0;
frame = TOS;
if (flag) {
return;
}
flag = 1;
for (i = _k = 0; 0 <= NSYM ? _k < NSYM : _k > NSYM; i = 0 <=