some functional code -> iterative
[lambda.git] / code / lambda.js
index c0dbb0f..609cce0 100644 (file)
@@ -115,14 +115,19 @@ function Variable(name, tag) {
     this.tag = tag || 0;
     this.to_string = function () {
         // append count copies of str to accum
     this.tag = tag || 0;
     this.to_string = function () {
         // append count copies of str to accum
-        function markup(accum, count) {
-            if (count === 0) {
-                return accum;
-            } else {
-                return markup(accum + "'", count - 1);
-            }
-        }
-        return markup(this.name, this.tag);
+//         function markup(accum, count) {
+//             if (count === 0) {
+//                 return accum;
+//             } else {
+//                 return markup(accum + "'", count - 1);
+//             }
+//         }
+//         return markup(this.name, this.tag);
+               var s = this.name;
+               for (var count = 0; count < this.tag; count += 1) {
+                       s += "'";
+               }
+               return s;
     };
     this.equal = function (other) {
         return (this.tag === other.tag) && (this.name === other.name);
     };
     this.equal = function (other) {
         return (this.tag === other.tag) && (this.name === other.name);
@@ -192,13 +197,19 @@ function Lambda_var(variable) {
     };
     this.eval_loop = function (stack, eta) {
         function unwind(left, stack) {
     };
     this.eval_loop = function (stack, eta) {
         function unwind(left, stack) {
-            if (stack.length === 0) {
-                return left;
-            } else {
-                var x = stack[0];
-                var xs = stack.slice(1);
-                return unwind(new Lambda_app(left, x.eval_loop([], eta)), xs);
-            }
+//             if (stack.length === 0) {
+//                 return left;
+//             } else {
+//                 var x = stack[0];
+//                 var xs = stack.slice(1);
+//                 return unwind(new Lambda_app(left, x.eval_loop([], eta)), xs);
+//             }
+                       var res = left, x;
+                       while (stack.length) {
+                               x = stack.shift();
+                               res = new Lambda_app(res, x.eval_loop([], eta));
+                       }
+                       return res;
         }
         return unwind(this, stack);
     };
         }
         return unwind(this, stack);
     };
@@ -364,16 +375,31 @@ function Lambda_lam(variable, body) {
         }
     };
     this.to_int = function (sofar) {
         }
     };
     this.to_int = function (sofar) {
-        if (this.body.body && this.body.body.variable && this.body.bound.equal(this.body.body.variable)) {
-            return 0 + sofar;
-        } else if (this.body.variable && this.bound.equal(this.body.variable)) {
-            return 1 + sofar;
-        } else if (this.body.body && this.body.body.left && this.body.body.left.variable && this.bound.equal(this.body.body.left.variable)) {
-            var new_int = new Lambda_lam(this.bound, new Lambda_lam(this.body.bound, this.body.body.right));
-            return new_int.to_int(1 + sofar);
-        } else {
-            return "not a church numeral";
-        }
+//         if (this.body.body && this.body.body.variable && this.body.bound.equal(this.body.body.variable)) {
+//             return 0 + sofar;
+//         } else if (this.body.variable && this.bound.equal(this.body.variable)) {
+//             return 1 + sofar;
+//         } else if (this.body.body && this.body.body.left && this.body.body.left.variable && this.bound.equal(this.body.body.left.variable)) {
+//             var new_int = new Lambda_lam(this.bound, new Lambda_lam(this.body.bound, this.body.body.right));
+//             return new_int.to_int(1 + sofar);
+//         } else {
+//             return "not a church numeral";
+//         }
+               var res = 0, s = this.bound, z, cursor;
+               if (this.body.variable && s.equal(this.body.variable)) {
+                       return 1;
+               } else if (this.body.bound) {
+                       z = this.body.bound;
+                       cursor = this.body.body;
+                       while (cursor.left && cursor.left.variable && s.equal(cursor.left.variable)) {
+                               res += 1;
+                               cursor = cursor.right;
+                       }
+                       if (cursor.variable && z.equal(cursor.variable)) {
+                               return res;
+                       }
+               }
+               return "not a church numeral";
     };
 }
 
     };
 }