add reference counter for future smarter allocations
[lambda.git] / reduce.c
index 19c193c..b5e64e1 100644 (file)
--- a/reduce.c
+++ b/reduce.c
@@ -71,27 +71,27 @@ void lambda_beta(struct lambda *ident, struct lambda *body, struct lambda *targe
        }
 }
 
-void lambda_reduce(struct lambda *t, struct lambda *total, int *maxdepth)
+void lambda_reduce(struct lambda **t, struct lambda **total, int *maxdepth)
 {
        if(*maxdepth == 0)
                return;
        struct lambda *t1, *t2;
-       if(t->which == lambda_app){
-               t1 = t->data.application.expr1;
-               t2 = t->data.application.expr2;
-               lambda_reduce(t1, total, maxdepth);
+       if((*t)->which == lambda_app){
+               t1 = (*t)->data.application.expr1;
+               t2 = (*t)->data.application.expr2;
+               lambda_reduce(&t1, total, maxdepth);
                if(t1->which == lambda_abs){
                        if(t1->data.abstraction.strict)
-                               lambda_reduce(t2, total, maxdepth);
-                       lambda_print(total, t);
+                               lambda_reduce(&t2, total, maxdepth);
+                       lambda_print(*total, *t);
                        printf("β -> ");
-                       lambda_beta(t1, t1->data.abstraction.expr, t2, total);
+                       lambda_beta(t1, t1->data.abstraction.expr, t2, *total);
                        lambda_free(t2);
                        t2 = copy(t1->data.abstraction.expr);
                        if(total == t)
-                               *total = *t2;
+                               **total = *t2;
                        lambda_free(t1);
-                       *t = *t2;
+                       **t = *t2;
                        free(t2);
                        (*maxdepth)--;
                        lambda_reduce(t, total, maxdepth);