return s;
};
-
// try {
// if (console && console.debug) {
// function print() {
// }
// } 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];
return body;
};
+
+
+ var itself = function () {
+ return this;
+ };
+
symbol("(end)");
symbol("(name)").handler = name_handler;
symbol("(literal)").handler = itself;
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") {