Fix reduction, add declarations
[lambda.git] / mem.c
diff --git a/mem.c b/mem.c
index 19c5c8e..1e112a8 100644 (file)
--- a/mem.c
+++ b/mem.c
@@ -20,3 +20,24 @@ void lambda_free(struct lambda *t)
        }
        free(t);
 }
+
+struct lambda *copy(struct lambda *t)
+{
+       struct lambda *c = malloc(sizeof (struct lambda));
+       c->which = t->which;
+       switch(t->which){
+       case lambda_ident:
+               c->data.identifier = strdup(t->data.identifier);
+               break;
+       case lambda_abs:
+               c->data.abstraction.ident = strdup(t->data.abstraction.ident);
+               c->data.abstraction.expr = copy(t->data.abstraction.expr);
+               break;
+       case lambda_app:
+               c->data.application.expr1 = copy(t->data.application.expr1);
+               c->data.application.expr2 = copy(t->data.application.expr2);
+               break;
+       }
+       return c;
+}
+