5 void lambda_free(struct lambda
*t
)
10 free(t
->data
.identifier
.ident
);
13 free(t
->data
.abstraction
.ident
);
14 lambda_free(t
->data
.abstraction
.expr
);
17 lambda_free(t
->data
.application
.expr1
);
18 lambda_free(t
->data
.application
.expr2
);
25 void binding_replace(struct lambda
*b
, struct lambda
*from
, struct lambda
*to
)
29 if(b
->data
.identifier
.binding
== from
)
30 b
->data
.identifier
.binding
= to
;
33 binding_replace(b
->data
.abstraction
.expr
, from
, to
);
36 binding_replace(b
->data
.application
.expr1
, from
, to
);
37 binding_replace(b
->data
.application
.expr2
, from
, to
);
42 struct lambda
*copy(struct lambda
*t
)
44 struct lambda
*c
= make_lambda();
48 c
->data
.identifier
.ident
= strdup(t
->data
.identifier
.ident
);
49 c
->data
.identifier
.binding
= t
->data
.identifier
.binding
;
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
);
58 c
->data
.application
.expr1
= copy(t
->data
.application
.expr1
);
59 c
->data
.application
.expr2
= copy(t
->data
.application
.expr2
);