X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=code%2Flambda.js;fp=code%2Flambda.js;h=609cce03f850a15d68c91cc4cbf00716d214512b;hp=0eea4c9275befaeafb673d3696e8a813dfbfce1f;hb=b059b718b62f3b4beffb3bd7fbe66af01069f9c9;hpb=e17c03bd8ce5b051ce06e123d3ce65d6086591be diff --git a/code/lambda.js b/code/lambda.js index 0eea4c92..609cce03 100644 --- a/code/lambda.js +++ b/code/lambda.js @@ -207,14 +207,11 @@ function Lambda_var(variable) { var res = left, x; while (stack.length) { x = stack.shift(); - // res = new Lambda_app(res, x.eval_loop([], eta)); - res = new Lambda_app(res, reduce(x, eta, false)); + res = new Lambda_app(res, x.eval_loop([], eta)); } return res; } - // return unwind(this, stack); - // trampoline to, args - return [null, unwind(this, stack)]; + return unwind(this, stack); }; this.eval_cbv = function (aggressive) { return this; @@ -264,9 +261,7 @@ function Lambda_app(left, right) { this.eval_loop = function (stack, eta) { var new_stack = stack.slice(0); new_stack.unshift(this.right); - // return this.left.eval_loop(new_stack, eta); - // trampoline to, args - return [this.left, new_stack, eta]; + return this.left.eval_loop(new_stack, eta); }; this.eval_cbv = function (aggressive) { var left = this.left.eval_cbv(aggressive); @@ -360,19 +355,16 @@ function Lambda_lam(variable, body) { }; this.eval_loop = function (stack, eta) { 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 [null, term.check_eta()]; - } else { - return [null, term]; - } + var term = new Lambda_lam(this.bound, this.body.eval_loop([], eta)); + if (eta) { + return term.check_eta(); + } else { + return term; + } } else { var x = stack[0]; var xs = stack.slice(1); - // return subst(this.bound, x, this.body).eval_loop(xs, eta); - // trampoline to, args - return [subst(this.bound, x, this.body), xs, eta]; + return subst(this.bound, x, this.body).eval_loop(xs, eta); } }; this.eval_cbv = function (aggressive) { @@ -422,13 +414,7 @@ function reduce(expr, eta, cbv) { if (cbv) { return expr.eval_cbv(cbv > 1); } else { - // return expr.eval_loop([], eta); - var to_eval = expr, res = [[], eta]; - while (to_eval !== null) { - res = to_eval.eval_loop.apply(to_eval, res); - to_eval = res.shift(); - } - return res[0]; + return expr.eval_loop([], eta); } } @@ -450,11 +436,42 @@ try { } } 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) {