6 extern struct stackval_t
*start();
8 struct stackval_t
*eq(struct stackval_t
*l
, struct stackval_t
*r
)
10 struct stackval_t
*t
= malloc(sizeof(struct stackval_t
));
13 return ap(ap(t
, l
), r
);
15 struct stackval_t
*add(struct stackval_t
*l
, struct stackval_t
*r
)
17 struct stackval_t
*t
= malloc(sizeof(struct stackval_t
));
20 return ap(ap(t
, l
), r
);
22 struct stackval_t
*mul(struct stackval_t
*l
, struct stackval_t
*r
)
24 struct stackval_t
*t
= malloc(sizeof(struct stackval_t
));
27 return ap(ap(t
, l
), r
);
30 struct stackval_t
*sub(struct stackval_t
*l
, struct stackval_t
*r
)
32 struct stackval_t
*t
= malloc(sizeof(struct stackval_t
));
35 return ap(ap(t
, l
), r
);
38 struct stackval_t
*_if(struct stackval_t
*l
, struct stackval_t
*m
, struct stackval_t
*r
)
40 struct stackval_t
*t
= malloc(sizeof(struct stackval_t
));
43 return ap(ap(ap(t
, l
), m
), r
);
46 struct stackval_t
*lit(uint64_t i
)
48 struct stackval_t
*t
= malloc(sizeof(struct stackval_t
));
54 struct stackval_t
*ap(struct stackval_t
*l
, struct stackval_t
*r
)
56 struct stackval_t
*t
= malloc(sizeof(struct stackval_t
));
63 struct stackval_t
*var(void *i
)
65 struct stackval_t
*t
= malloc(sizeof(struct stackval_t
));
67 t
->data
.fun
.arity
= 1;
72 void print_stackval_t(struct stackval_t
*sv
)
79 printf("Func(%lu)", sv
->data
.fun
.arity
);
82 printf("%llu", sv
->data
.lit
);
85 switch(sv
->data
.code
){
102 printf("halp: %lu", sv
->data
.code
);
107 print_stackval_t(sv
->data
.app
.l
);
109 print_stackval_t(sv
->data
.app
.r
);
113 printf("halp: %lu", sv
->type
);
118 struct stackval_t
*reduce(struct stackval_t
*sv
)
122 printf("Cannot reduce func\n");
127 printf("Cannot reduce bultin\n");
130 switch(sv
->data
.app
.l
->type
){
132 // printf("APp to code");
135 switch(sv
->data
.app
.l
->data
.fun
.arity
){
137 return ((struct stackval_t
*(*)(struct stackval_t
*))sv
->data
.app
.l
->data
.fun
.fun
)(sv
->data
.app
.r
);
139 printf("App to fun");
142 printf("Cannot apply to: ");
143 print_stackval_t(sv
->data
.app
.l
);
148 printf("halp: %lu", sv
->type
);
153 int main(int argc
, char **argv
)
155 struct stackval_t
*sv
= NULL
;
157 while(sv
!= NULL
&& sv
->type
!= LIT
){
158 print_stackval_t(sv
);