+ function make_constants() {
+
+ 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};
+ 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;
+ }
+ if (this.first) {
+ return make_app(this.first.handler(), res);
+ } else {
+ 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));
+ 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)));
+
+ // trush \uv.vu = CI = box
+ constant("T", make_lam2(u, v, make_app(vv, uu)));
+ // vireo \uvw.wuv = pair
+ constant("V", make_lam3(u, v, x, make_app3(xx, uu, vv)));
+ // warbler \uv.uvv = C(BM(BBT) = C(BS(C(BBI)I))I
+ constant("W", make_lam2(u, v, make_app3(uu, vv, vv)));
+ // mockingbird \u.uu = SII = omega
+ constant("M", make_lam(u, make_app(uu, uu)));
+ // lark \uv.u(vv) = CBM = BWB
+ constant("L", make_lam2(u, v, make_app(uu, make_app(vv, vv))));
+ // Y is SLL
+
+ }
+ make_constants();
+