return res;
}
// return unwind(this, stack);
- // post-processor, trampoline to, args
- return [null, null, unwind(this, stack)];
+ // trampoline to, args
+ return [null, unwind(this, stack)];
};
this.eval_cbv = function (aggressive) {
return this;
var new_stack = stack.slice(0);
new_stack.unshift(this.right);
// return this.left.eval_loop(new_stack, eta);
- // post-processor, trampoline to, args
- return [null, this.left, new_stack, eta];
+ // trampoline to, args
+ return [this.left, new_stack, eta];
};
this.eval_cbv = function (aggressive) {
var left = this.left.eval_cbv(aggressive);
}
};
this.eval_loop = function (stack, eta) {
- function post(evaluated_body) {
- var term = new Lambda_lam(this.bound, evaluated_body);
+ if (stack.length === 0) {
+ // var term = new Lambda_lam(this.bound, this.body.eval_loop([], eta));
+ var term = new Lambda_lam(this.bound, reduce(this.body, eta, false));
if (eta) {
- return term.check_eta();
+ return [null, term.check_eta()];
} else {
- return term;
+ return [null, term];
}
- }
- if (stack.length === 0) {
-// var term = new Lambda_lam(this.bound, this.body.eval_loop([], eta));
-// if (eta) {
-// return term.check_eta();
-// } else {
-// return term;
-// }
- // post-processor, trampoline to, args
- return [post, this.body, [], eta];
} else {
var x = stack[0];
var xs = stack.slice(1);
// return subst(this.bound, x, this.body).eval_loop(xs, eta);
- // post-processor, trampoline to, args
- return [null, subst(this.bound, x, this.body), xs, eta];
+ // trampoline to, args
+ return [subst(this.bound, x, this.body), xs, eta];
}
};
this.eval_cbv = function (aggressive) {
return expr.eval_cbv(cbv > 1);
} else {
// return expr.eval_loop([], eta);
- var post = null, to_eval = expr, res = [[], eta];
+ var to_eval = expr, res = [[], eta];
while (to_eval !== null) {
res = to_eval.eval_loop.apply(to_eval, res);
- post = res.shift();
to_eval = res.shift();
- if (post) {
- res = post(res);
- }
}
return res[0];
}
}
} catch (e) {}
-/*
-let true = K in
-let false = \x y. y in
-let and = \l r. l r false in
-let or = \l r. l true r in
-let pair = \u v f. f u v in
-let triple = \u v w f. f u v w in
-let succ = \n s z. s (n s z) in
-let pred = \n s z. n (\u v. v (u s)) (K z) I in
-let ifzero = \n. n (\u v. v (u succ)) (K 0) (\n withp whenz. withp n) in
-let add = \m n. n succ m in
-let mul = \m n. n (\z. add m z) 0 in
-let mul = \m n s. m (n s) in
-let sub = (\mzero msucc mtail. \m n. n mtail (m msucc mzero) true) (pair 0 I) (\d. d (\a b. pair (succ a) (K d))) (\d. d false d) in
-let min = \m n. sub m (sub m n) in
-let max = \m n. add n (sub m n) in
-let lt = (\mzero msucc mtail. \n m. n mtail (m msucc mzero) true (\x. true) false) (pair 0 I) (\d. d (\a b. pair (succ a) (K d))) (\d. d false d) in
-let leq = (\mzero msucc mtail. \m n. n mtail (m msucc mzero) true (\x. false) true) (pair 0 I) (\d. d (\a b. pair (succ a) (K d))) (\d. d false d) in
-let eq = (\mzero msucc mtail. \m n. n mtail (m msucc mzero) true (\x. false) true) (pair 0 (K (pair 1 I))) (\d. d (\a b. pair (succ a) (K d))) (\d. d false d) in
-let divmod = (\mzero msucc mtail. \n divisor.
- (\dhead. n (mtail dhead) (\sel. dhead (sel 0 0)))
- (divisor msucc mzero (\a b c. c x))
- (\d m a b c. pair d m) )
- (triple succ (K 0) I)
- (\d. triple I succ (K d))
- (\dhead d. d (\dz mz df mf drest sel. drest dhead (sel (df dz) (mf mz)))) in
-let div = \n d. divmod n d true in
-let mod = \n d. divmod n d false in
-let Y = \f. (\y. f(y y)) (\y. f(y y)) in
-let Z = (\u f. f(u u f)) (\u f. f(u u f)) in
-let fact = \y. y (\f n. ifzero n (\p. mul n (f p)) 1) in
-fact Z 3
-*/
+// Chris's original
+
// // Basic data structure, essentially a LISP/Scheme-like cons
// // pre-terminal nodes are expected to be of the form new cons(null, "string")
// function cons(car, cdr) {