void eval_product(void) { int i, j, k; // 1st arg (quoted) X = cadr(p1); if (!issymbol(X)) stop("product: 1st arg?"); // 2nd arg push(caddr(p1)); eval(); j = pop_integer(); if (j == (int) 0x80000000) stop("product: 2nd arg?"); // 3rd arg push(cadddr(p1)); eval(); k = pop_integer(); if (k == (int) 0x80000000) stop("product: 3rd arg?"); // 4th arg // fix p1 = cddddr(p1); p1 = car(p1); B = get_binding(X); A = get_arglist(X); push_integer(1); for (i = j; i <= k; i++) { push_integer(i); I = pop(); set_binding(X, I); push(p1); eval(); multiply(); } set_binding_and_arglist(X, B, A); }
// (if2 'any1 'any2 'any3 'any4 'any5 . prg) -> any any doIf2(any x) { any a; x = cdr(x); if (isNil(a = EVAL(car(x)))) { x = cdr(x); if (isNil(a = EVAL(car(x)))) return prog(cddddr(x)); val(At) = a; x = cdddr(x); return EVAL(car(x)); } val(At) = a; x = cdr(x); if (isNil(a = EVAL(car(x)))) { x = cddr(x); return EVAL(car(x)); } val(At) = a; x = cdr(x); return EVAL(car(x)); }