change printing
[lambda.git] / reduce.c
index 91299fc..12914bf 100644 (file)
--- a/reduce.c
+++ b/reduce.c
@@ -6,23 +6,17 @@
 #include "print.h"
 #include "mem.h"
 
-#define binder(t) (*t)->data.identifier.binding
 #define lhs(t) (*t)->data.application.expr1
 #define rhs(t) (*t)->data.application.expr2
 #define bdy(t) (*t)->data.abstraction.expr
 
 void lambda_beta(struct lambda *binding, struct lambda **body, struct lambda *target, struct lambda *total)
 {
-//     lambda_print(*body, NULL);
-//     printf(" [%s=", binding->data.abstraction.ident);
-//     lambda_print(target, NULL);
-//     printf("]\n");
        switch((*body)->which){
        case lambda_ident:
-               if(binder(body) == binding){
+               if((*body)->data.identifier.binding == binding){
                        lambda_free(*body);
-                       *body = target;
-                       target->refcount++;
+                       *body = copy(target);
                }
                break;
        case lambda_abs:
@@ -47,19 +41,15 @@ bool lambda_reduce(struct lambda **t, struct lambda **total, bool applicative)
                        if(lhs(t)->data.abstraction.strict)
                                lambda_reduce(&rhs(t), total, true);
 
-                       if(lhs(t) == rhs(t))
-                               rhs(t) = copy(rhs(t));
-
                        //In this abstraction we substitute the result with the rhs
                        lambda_print(*total, *t);
                        lambda_beta(lhs(t), &lhs(t)->data.abstraction.expr, rhs(t), *total);
 
-                       struct lambda *newt = lhs(t)->data.abstraction.expr;
-                       lhs(t)->data.abstraction.expr->refcount++;
+                       struct lambda *newt = copy(lhs(t)->data.abstraction.expr);
                        lambda_free(*t);
                        *t = newt;
 
-                       printf("\nβ -> ");
+                       printf("β -> ");
                        return true;
                }
        } else if ((*t)->which == lambda_abs) {