5 void lambda_free(struct lambda
*t
)
11 free(t
->data
.identifier
.ident
);
14 free(t
->data
.abstraction
.ident
);
15 lambda_free(t
->data
.abstraction
.expr
);
18 lambda_free(t
->data
.application
.expr1
);
19 lambda_free(t
->data
.application
.expr2
);
29 void binding_replace(struct lambda
*b
, struct lambda
*from
, struct lambda
*to
)
33 if(b
->data
.identifier
.binding
== from
)
34 b
->data
.identifier
.binding
= to
;
37 binding_replace(b
->data
.abstraction
.expr
, from
, to
);
40 binding_replace(b
->data
.application
.expr1
, from
, to
);
41 binding_replace(b
->data
.application
.expr2
, from
, to
);
46 struct lambda
*copy(struct lambda
*t
)
48 struct lambda
*c
= make_lambda();
52 c
->data
.identifier
.ident
= strdup(t
->data
.identifier
.ident
);
53 c
->data
.identifier
.binding
= t
->data
.identifier
.binding
;
56 c
->data
.abstraction
.ident
= strdup(t
->data
.abstraction
.ident
);
57 c
->data
.abstraction
.strict
= t
->data
.abstraction
.strict
;
58 c
->data
.abstraction
.expr
= copy(t
->data
.abstraction
.expr
);
59 binding_replace(c
->data
.abstraction
.expr
, t
, c
);
62 c
->data
.application
.expr1
= copy(t
->data
.application
.expr1
);
63 c
->data
.application
.expr2
= copy(t
->data
.application
.expr2
);