change printing
[lambda.git] / mem.c
diff --git a/mem.c b/mem.c
index 0792a97..270679b 100644 (file)
--- a/mem.c
+++ b/mem.c
@@ -1,5 +1,6 @@
 #include <stdlib.h>
 #include "lambda.h"
+#include "print.h"
 
 void lambda_free(struct lambda *t)
 {
@@ -17,23 +18,41 @@ void lambda_free(struct lambda *t)
                        lambda_free(t->data.application.expr2);
                        break;
                }
+               free(t);
+       }
+}
+
+void binding_replace(struct lambda *b, struct lambda *from, struct lambda *to)
+{
+       switch(b->which){
+       case lambda_ident:
+               if(b->data.identifier.binding == from)
+                       b->data.identifier.binding = to;
+               break;
+       case lambda_abs:
+               binding_replace(b->data.abstraction.expr, from, to);
+               break;
+       case lambda_app:
+               binding_replace(b->data.application.expr1, from, to);
+               binding_replace(b->data.application.expr2, from, to);
+               break;
        }
-       free(t);
 }
 
 struct lambda *copy(struct lambda *t)
 {
-       struct lambda *c = malloc(sizeof (struct lambda));
+       struct lambda *c = make_lambda();
        c->which = t->which;
        switch(t->which){
        case lambda_ident:
                c->data.identifier.ident = strdup(t->data.identifier.ident);
-               c->data.identifier.revision = t->data.identifier.revision;
+               c->data.identifier.binding = t->data.identifier.binding;
                break;
        case lambda_abs:
                c->data.abstraction.ident = strdup(t->data.abstraction.ident);
+               c->data.abstraction.strict = t->data.abstraction.strict;
                c->data.abstraction.expr = copy(t->data.abstraction.expr);
-               c->data.abstraction.revision = t->data.abstraction.revision;
+               binding_replace(c->data.abstraction.expr, t, c);
                break;
        case lambda_app:
                c->data.application.expr1 = copy(t->data.application.expr1);
@@ -42,4 +61,3 @@ struct lambda *copy(struct lambda *t)
        }
        return c;
 }
-