readme
[minfp.git] / rts.c
1 #include <stdint.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include "rts.h"
5
6 extern struct stackval_t *start();
7
8 struct stackval_t *eq(struct stackval_t *l, struct stackval_t *r)
9 {
10 struct stackval_t *t = malloc(sizeof(struct stackval_t));
11 t->type = CODE;
12 t->data.code = EQ;
13 return ap(ap(t, l), r);
14 }
15 struct stackval_t *add(struct stackval_t *l, struct stackval_t *r)
16 {
17 struct stackval_t *t = malloc(sizeof(struct stackval_t));
18 t->type = CODE;
19 t->data.code = ADD;
20 return ap(ap(t, l), r);
21 }
22 struct stackval_t *mul(struct stackval_t *l, struct stackval_t *r)
23 {
24 struct stackval_t *t = malloc(sizeof(struct stackval_t));
25 t->type = CODE;
26 t->data.code = MUL;
27 return ap(ap(t, l), r);
28 }
29
30 struct stackval_t *sub(struct stackval_t *l, struct stackval_t *r)
31 {
32 struct stackval_t *t = malloc(sizeof(struct stackval_t));
33 t->type = CODE;
34 t->data.code = SUB;
35 return ap(ap(t, l), r);
36 }
37
38 struct stackval_t *_if(struct stackval_t *l, struct stackval_t *m, struct stackval_t *r)
39 {
40 struct stackval_t *t = malloc(sizeof(struct stackval_t));
41 t->type = CODE;
42 t->data.code = IF;
43 return ap(ap(ap(t, l), m), r);
44 }
45
46 struct stackval_t *lit(uint64_t i)
47 {
48 struct stackval_t *t = malloc(sizeof(struct stackval_t));
49 t->type = LIT;
50 t->data.lit = i;
51 return t;
52 }
53
54 struct stackval_t *ap(struct stackval_t *l, struct stackval_t *r)
55 {
56 struct stackval_t *t = malloc(sizeof(struct stackval_t));
57 t->type = AP;
58 t->data.app.l = l;
59 t->data.app.r = r;
60 return t;
61 }
62
63 struct stackval_t *var(void *i)
64 {
65 struct stackval_t *t = malloc(sizeof(struct stackval_t));
66 t->type = FUN;
67 t->data.fun.arity = 1;
68 t->data.fun.fun = i;
69 return t;
70 }
71
72 void print_stackval_t(struct stackval_t *sv)
73 {
74 if(sv == NULL){
75 printf("null");
76 }
77 switch(sv->type) {
78 case FUN:
79 printf("Func(%lu)", sv->data.fun.arity);
80 break;
81 case LIT:
82 printf("%llu", sv->data.lit);
83 break;
84 case CODE:
85 switch(sv->data.code){
86 case ADD:
87 printf("add");
88 break;
89 case MUL:
90 printf("mul");
91 break;
92 case EQ:
93 printf("eq");
94 break;
95 case SUB:
96 printf("sub");
97 break;
98 case IF:
99 printf("if");
100 break;
101 default:
102 printf("halp: %lu", sv->data.code);
103 break;
104 }
105 case AP:
106 printf("(");
107 print_stackval_t(sv->data.app.l);
108 printf(" ");
109 print_stackval_t(sv->data.app.r);
110 printf(")");
111 break;
112 default:
113 printf("halp: %lu", sv->type);
114 break;
115 }
116 }
117
118 struct stackval_t *reduce(struct stackval_t *sv)
119 {
120 switch(sv->type) {
121 case FUN:
122 printf("Cannot reduce func\n");
123 return NULL;
124 case LIT:
125 return sv;
126 case CODE:
127 printf("Cannot reduce bultin\n");
128 return NULL;
129 case AP:
130 switch(sv->data.app.l->type){
131 // case CODE:
132 // printf("APp to code");
133 // return NULL:
134 case FUN:
135 switch(sv->data.app.l->data.fun.arity){
136 case 1:
137 return ((struct stackval_t *(*)(struct stackval_t *))sv->data.app.l->data.fun.fun)(sv->data.app.r);
138 }
139 printf("App to fun");
140 return NULL;
141 default:
142 printf("Cannot apply to: ");
143 print_stackval_t(sv->data.app.l);
144 return NULL;
145 }
146 return NULL;
147 default:
148 printf("halp: %lu", sv->type);
149 return NULL;
150 }
151 }
152
153 int main(int argc, char **argv)
154 {
155 struct stackval_t *sv = NULL;
156 sv = start();
157 while(sv != NULL && sv->type != LIT){
158 print_stackval_t(sv);
159 printf("\n");
160 sv = reduce(sv);
161 }
162 return EXIT_SUCCESS;
163 }