use debruijn indexing
[lambda.git] / mem.c
diff --git a/mem.c b/mem.c
index a0b18da..4d73188 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)
 {
@@ -25,20 +26,37 @@ void lambda_free(struct lambda *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;
+       }
+}
+
 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);
@@ -47,4 +65,3 @@ struct lambda *copy(struct lambda *t)
        }
        return c;
 }
-