tweak lambda evaluator
[lambda.git] / code / parse.js
index 4fbab09..d9f76ec 100644 (file)
@@ -75,7 +75,6 @@ var make_parse = function () {
         return s;
     };
 
-
 //     try {
 //         if (console && console.debug) {
 //             function print() {
@@ -84,13 +83,8 @@ var make_parse = function () {
 //         }
 //     } catch (e) {}
 
-
-    var itself = function () {
-        return this;
-    };
-
-    var var_table = {};
-    var name_table = {};
+    var var_table;
+    var name_table;
 
     var name_handler = function () {
         var n = name_table[this.value];
@@ -132,6 +126,12 @@ var make_parse = function () {
         return body;
     };
 
+
+
+    var itself = function () {
+        return this;
+    };
+
     symbol("(end)");
     symbol("(name)").handler = name_handler;
     symbol("(literal)").handler = itself;
@@ -144,6 +144,52 @@ var make_parse = function () {
     symbol("lambda").handler = lambda_handler;
     symbol(".");
 
+       function make_constants() {
+
+               var constant = function (s, v) {
+                       var x = symbol(s);
+                       x.handler = function () {
+                               this.value = symbol_table[this.id].value;
+                               this.arity = "literal";
+                               return this;
+                       };
+                       x.value = v;
+                       return x;
+               };
+
+               function make_lam2(a, b, aa) {
+                       return make_lam(a, make_lam(b, aa));
+               }
+               function make_lam3(a, b, c, aa) {
+                       return make_lam(a, make_lam(b, make_lam(c, aa)));
+               }
+               }
+               function make_app3(aa, bb, cc) {
+                       return make_app(make_app(aa, bb), cc);
+               }
+               var u = make_var("u");
+               var v = make_var("v");
+               var x = make_var("x");
+               var s = make_var("s");
+               var z = make_var("z");
+               var uu = new Lambda_var(u);
+               var vv = new Lambda_var(v);
+               var xx = new Lambda_var(x);
+               var ss = new Lambda_var(s);
+               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};
+
+               constant("S", make_lam3(u, v, x, make_app3(uu, xx, make_app(vv, xx))) );
+               constant("K", make_lam2(u, v, uu) );
+               constant("I", make_lam(x, xx) );
+               constant("B", make_lam3(u, v, x, make_app(uu, make_app(vv, xx))) );
+               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();
+
     var expression = function (in_let) {
         var t, n;
         if (token.id === "\\" || token.id === "lambda") {