X-Git-Url: http://lambda.jimpryor.net/git/gitweb.cgi?p=lambda.git;a=blobdiff_plain;f=code%2Fparse.js;h=382ba029427d0335004c456b71137b2f9b711148;hp=fc3b83d8f6235906fdb0c0ef0699b6ffab6bcf75;hb=a3b99e629ce7473014b705dbb8ea9c4321639805;hpb=0a787c1b90bcdd2eb935541c67640ddf6715fddb diff --git a/code/parse.js b/code/parse.js index fc3b83d8..382ba029 100644 --- a/code/parse.js +++ b/code/parse.js @@ -40,8 +40,8 @@ var make_parse = function () { a = o.arity || "keyword"; } } else if (a === "number") { - o = symbol_table["(literal)"]; - a = "literal"; + o = symbol_table["(number)"]; + a = "literal"; } else if (a === "operator") { o = symbol_table[v]; if (!o) { @@ -79,7 +79,6 @@ var make_parse = function () { s = Object.create(original_symbol); s.id = s.value = id; symbol_table[id] = s; - print(s, s.arity); } return s; }; @@ -127,14 +126,8 @@ var make_parse = function () { return body; }; - - var itself = function () { - return this; - }; - symbol("(end)"); symbol("(name)").handler = name_handler; - symbol("(literal)").handler = itself; symbol("let").handler = lambda_handler; symbol("=").handler = branch_handler; symbol("in"); @@ -146,17 +139,6 @@ var make_parse = function () { function make_constants() { - var constant = function (s, v) { - var x = symbol(s); - x.handler = function () { - this.value = symbol_table[this.id].value; - return this; - }; - x.value = v; - x.arity = "literal"; - return x; - }; - function make_lam2(a, b, aa) { return make_lam(a, make_lam(b, aa)); } @@ -178,6 +160,39 @@ var make_parse = function () { var zz = new Lambda_var(z); var_table = { u: u, v: v, x: x, s: s, z: z}; name_table = {u: uu, v: vv, x: xx, s: ss, z: zz}; + number_table = {}; + + // constants have their own id and arity = literal + // numbers have id = "(number)" and arity = literal + symbol("(number)").handler = function () { + var n = this.value; + var res = number_table[n]; + if (!res) { + res = zz; + while (n > 0) { + n -= 1; + res = make_app(ss, res); + } + res = make_lam2(s, z, res); + number_table[this.value] = res; + } + return res; + } + + var constant = function (s, v) { + var x = symbol(s); + x.handler = function () { + this.value = symbol_table[this.id].value; + if (this.first) { + return make_app(this.first.handler(), this.value); + } else { + return this.value; + } + }; + x.arity = "literal"; + x.value = v; + return x; + }; constant("S", make_lam3(u, v, x, make_app3(uu, xx, make_app(vv, xx)))); constant("K", make_lam2(u, v, uu)); @@ -186,6 +201,7 @@ var make_parse = function () { constant("C", make_lam3(u, v, x, make_app3(uu, xx, vv))); constant("W", make_lam2(u, v, make_app3(uu, vv, vv))); constant("T", make_lam2(u, v, make_app(vv, uu))); + } make_constants();