bbe52de1e87d7c17807b4ee4e170b0fe7a72e027
9 #define lhs(t) (*t)->data.application.expr1
10 #define rhs(t) (*t)->data.application.expr2
11 #define bdy(t) (*t)->data.abstraction.expr
13 void lambda_beta(struct lambda
*binding
, struct lambda
**body
, struct lambda
*target
, struct lambda
*total
)
15 switch((*body
)->which
){
17 if((*body
)->data
.identifier
.binding
== binding
){
24 lambda_beta(binding
, &bdy(body
), target
, total
);
27 lambda_beta(binding
, &lhs(body
), target
, total
);
28 lambda_beta(binding
, &rhs(body
), target
, total
);
33 bool lambda_reduce(struct lambda
**t
, struct lambda
**total
, bool applicative
)
35 if((*t
)->which
== lambda_app
){
37 if(lambda_reduce(&rhs(t
), total
, applicative
))
39 if(lhs(t
)->which
!= lambda_abs
){
40 return lambda_reduce(&lhs(t
), total
, applicative
);
42 if(lhs(t
)->data
.abstraction
.strict
)
43 lambda_reduce(&rhs(t
), total
, true);
47 rhs(t
) = copy(rhs(t
));
50 //In this abstraction we substitute the result with the rhs
51 lambda_print(*total
, *t
);
52 lambda_beta(lhs(t
), &lhs(t
)->data
.abstraction
.expr
, rhs(t
), *total
);
54 struct lambda
*newt
= lhs(t
)->data
.abstraction
.expr
;
55 lhs(t
)->data
.abstraction
.expr
->refcount
++;
62 } else if ((*t
)->which
== lambda_abs
) {
63 return lambda_reduce(&bdy(t
), total
, applicative
);