change printing
[lambda.git] / mem.c
1 #include <stdlib.h>
2 #include "lambda.h"
3 #include "print.h"
4
5 void lambda_free(struct lambda *t)
6 {
7 if(t != NULL){
8 switch(t->which){
9 case lambda_ident:
10 free(t->data.identifier.ident);
11 break;
12 case lambda_abs:
13 free(t->data.abstraction.ident);
14 lambda_free(t->data.abstraction.expr);
15 break;
16 case lambda_app:
17 lambda_free(t->data.application.expr1);
18 lambda_free(t->data.application.expr2);
19 break;
20 }
21 free(t);
22 }
23 }
24
25 void binding_replace(struct lambda *b, struct lambda *from, struct lambda *to)
26 {
27 switch(b->which){
28 case lambda_ident:
29 if(b->data.identifier.binding == from)
30 b->data.identifier.binding = to;
31 break;
32 case lambda_abs:
33 binding_replace(b->data.abstraction.expr, from, to);
34 break;
35 case lambda_app:
36 binding_replace(b->data.application.expr1, from, to);
37 binding_replace(b->data.application.expr2, from, to);
38 break;
39 }
40 }
41
42 struct lambda *copy(struct lambda *t)
43 {
44 struct lambda *c = make_lambda();
45 c->which = t->which;
46 switch(t->which){
47 case lambda_ident:
48 c->data.identifier.ident = strdup(t->data.identifier.ident);
49 c->data.identifier.binding = t->data.identifier.binding;
50 break;
51 case lambda_abs:
52 c->data.abstraction.ident = strdup(t->data.abstraction.ident);
53 c->data.abstraction.strict = t->data.abstraction.strict;
54 c->data.abstraction.expr = copy(t->data.abstraction.expr);
55 binding_replace(c->data.abstraction.expr, t, c);
56 break;
57 case lambda_app:
58 c->data.application.expr1 = copy(t->data.application.expr1);
59 c->data.application.expr2 = copy(t->data.application.expr2);
60 break;
61 }
62 return c;
63 }