aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-09 20:23:52 +0200
committerBad Diode <bd@badd10de.dev>2021-10-09 20:23:52 +0200
commitab6b56dfe916c17f34e684e69483895402783ae5 (patch)
tree37be6a2632fadaddc6c276211f78b3f733f2a6f6
parent859c33f37f0174a7b9d76cdcbe889ff12047c99c (diff)
downloadbdl-ab6b56dfe916c17f34e684e69483895402783ae5.tar.gz
bdl-ab6b56dfe916c17f34e684e69483895402783ae5.zip
Add proc_display and fix some bugs
-rwxr-xr-xMakefile2
-rwxr-xr-xsrc/bootstrap/main.c1
-rw-r--r--src/bootstrap/objects.c17
-rw-r--r--src/bootstrap/primitives.c134
4 files changed, 105 insertions, 49 deletions
diff --git a/Makefile b/Makefile
index 1f19b98..bfb7d4e 100755
--- a/Makefile
+++ b/Makefile
@@ -15,7 +15,7 @@ BIN := $(BUILD_DIR)/$(TARGET)
15 15
16# Compiler and linker configuration. 16# Compiler and linker configuration.
17CC := cc 17CC := cc
18CFLAGS := -Wall -Wextra -pedantic -DBIN_NAME=\"$(TARGET)\" 18CFLAGS := -Wall -Wextra -pedantic -DBIN_NAME=\"$(TARGET)\" -static
19CFLAGS += $(INC_FLAGS) 19CFLAGS += $(INC_FLAGS)
20LDFLAGS := 20LDFLAGS :=
21LDLIBS := 21LDLIBS :=
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c
index 419ce91..e5d9b17 100755
--- a/src/bootstrap/main.c
+++ b/src/bootstrap/main.c
@@ -36,6 +36,7 @@ init(void) {
36 environment[env_n++] = (EnvSymbol){make_symbol("-", 1), make_procedure(proc_sub)}; 36 environment[env_n++] = (EnvSymbol){make_symbol("-", 1), make_procedure(proc_sub)};
37 environment[env_n++] = (EnvSymbol){make_symbol("*", 1), make_procedure(proc_mul)}; 37 environment[env_n++] = (EnvSymbol){make_symbol("*", 1), make_procedure(proc_mul)};
38 environment[env_n++] = (EnvSymbol){make_symbol("/", 1), make_procedure(proc_div)}; 38 environment[env_n++] = (EnvSymbol){make_symbol("/", 1), make_procedure(proc_div)};
39 environment[env_n++] = (EnvSymbol){make_symbol("display", 7), make_procedure(proc_display)};
39} 40}
40 41
41void 42void
diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c
index 985709a..14ff50d 100644
--- a/src/bootstrap/objects.c
+++ b/src/bootstrap/objects.c
@@ -137,20 +137,3 @@ symbol_eq(Object *a, Object *b) {
137 } 137 }
138 return true; 138 return true;
139} 139}
140
141void display(Object *root);
142
143void
144display_pair(Object *root) {
145 display(root->car);
146 if (root->cdr->type == OBJ_TYPE_PAIR) {
147 printf(" ");
148 display_pair(root->cdr);
149 } else if (root->cdr->type == OBJ_TYPE_NIL) {
150 return;
151 } else {
152 printf(" . ");
153 display(root->cdr);
154 }
155}
156
diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c
index 50a2dfb..f72e484 100644
--- a/src/bootstrap/primitives.c
+++ b/src/bootstrap/primitives.c
@@ -1,3 +1,19 @@
1void display(Object *root);
2
3void
4display_pair(Object *root) {
5 display(root->car);
6 if (root->cdr->type == OBJ_TYPE_PAIR) {
7 printf(" ");
8 display_pair(root->cdr);
9 } else if (root->cdr->type == OBJ_TYPE_NIL) {
10 return;
11 } else {
12 printf(" . ");
13 display(root->cdr);
14 }
15}
16
1void 17void
2display(Object *root) { 18display(Object *root) {
3 if (root == NULL) { 19 if (root == NULL) {
@@ -29,26 +45,31 @@ display(Object *root) {
29 display_pair(root); 45 display_pair(root);
30 printf(")"); 46 printf(")");
31 } break; 47 } break;
32 default: { 48 case OBJ_TYPE_PROCEDURE: {
33 printf("TYPE NOT IMPLEMENTED FOR DISPLAY."); 49 printf("#{procedure}");
34 } break; 50 } break;
35 } 51 }
36} 52}
37 53
38Object * 54Object *
39eval(Object *root) { 55eval(Object *root) {
40 if (root == NULL) {
41 return NULL;
42 }
43
44 switch (root->type) { 56 switch (root->type) {
45 case OBJ_TYPE_FIXNUM: 57 case OBJ_TYPE_FIXNUM:
46 case OBJ_TYPE_BOOL: 58 case OBJ_TYPE_BOOL:
47 case OBJ_TYPE_NIL: 59 case OBJ_TYPE_NIL:
48 case OBJ_TYPE_STRING: 60 case OBJ_TYPE_STRING: {
49 case OBJ_TYPE_SYMBOL: {
50 return root; 61 return root;
51 } break; 62 } break;
63 case OBJ_TYPE_SYMBOL: {
64 Object *value = find_environment_symbol(root);
65 if (value == NULL) {
66 printf("error: symbol not found: `");
67 display(root);
68 printf("`\n");
69 return obj_nil;
70 }
71 return value;
72 } break;
52 case OBJ_TYPE_PAIR: { 73 case OBJ_TYPE_PAIR: {
53 if (root->car->type == OBJ_TYPE_SYMBOL) { 74 if (root->car->type == OBJ_TYPE_SYMBOL) {
54 Object *value = find_environment_symbol(root->car); 75 Object *value = find_environment_symbol(root->car);
@@ -56,7 +77,7 @@ eval(Object *root) {
56 printf("error: symbol not found: `"); 77 printf("error: symbol not found: `");
57 display(root->car); 78 display(root->car);
58 printf("`\n"); 79 printf("`\n");
59 return NULL; 80 return obj_nil;
60 } 81 }
61 if (value->type == OBJ_TYPE_PROCEDURE) { 82 if (value->type == OBJ_TYPE_PROCEDURE) {
62 return value->proc(root->cdr); 83 return value->proc(root->cdr);
@@ -67,18 +88,32 @@ eval(Object *root) {
67 printf("error: can't eval type %d.\n", root->type); 88 printf("error: can't eval type %d.\n", root->type);
68 } break; 89 } break;
69 } 90 }
70 91 return obj_nil;
71 return NULL;
72} 92}
73 93
74Object * 94Object *
75proc_add(Object *args) { 95proc_add(Object *args) {
76 ssize_t tot = 0; 96 // Extract first parameter.
97 Object *car = eval(args->car);
98 if (car == NULL) {
99 fprintf(stderr, "error: not enough arguments\n");
100 return obj_nil;
101 }
102 if (car->type != OBJ_TYPE_FIXNUM) {
103 fprintf(stderr, "addition not supported for type %d\n", car->type);
104 return obj_nil;
105 }
106 args = args->cdr;
107 ssize_t tot = car->fixnum;
108
77 while (args->type == OBJ_TYPE_PAIR) { 109 while (args->type == OBJ_TYPE_PAIR) {
78 Object *car = eval(args->car); 110 Object *car = eval(args->car);
111 if (car == NULL) {
112 car = obj_nil;
113 }
79 if (car->type != OBJ_TYPE_FIXNUM) { 114 if (car->type != OBJ_TYPE_FIXNUM) {
80 fprintf(stderr, "addition not supported for type %d\n", car->type); 115 fprintf(stderr, "addition not supported for type %d\n", car->type);
81 return NULL; 116 return obj_nil;
82 } 117 }
83 tot += car->fixnum; 118 tot += car->fixnum;
84 args = args->cdr; 119 args = args->cdr;
@@ -88,21 +123,27 @@ proc_add(Object *args) {
88 123
89Object * 124Object *
90proc_sub(Object *args) { 125proc_sub(Object *args) {
91 if (args->type != OBJ_TYPE_PAIR) {
92 fprintf(stderr, "substraction not supported for type %d\n", args->type);
93 return NULL;
94 }
95
96 // Extract first parameter. 126 // Extract first parameter.
97 Object *car = eval(args->car); 127 Object *car = eval(args->car);
128 if (car == NULL) {
129 fprintf(stderr, "error: not enough arguments\n");
130 return obj_nil;
131 }
132 if (car->type != OBJ_TYPE_FIXNUM) {
133 fprintf(stderr, "error: sub not supported for type %d\n", car->type);
134 return obj_nil;
135 }
98 args = args->cdr; 136 args = args->cdr;
99 ssize_t tot = car->fixnum; 137 ssize_t tot = car->fixnum;
100 138
101 while (args->type == OBJ_TYPE_PAIR) { 139 while (args->type == OBJ_TYPE_PAIR) {
102 Object *car = eval(args->car); 140 car = eval(args->car);
141 if (car == NULL) {
142 car = obj_nil;
143 }
103 if (car->type != OBJ_TYPE_FIXNUM) { 144 if (car->type != OBJ_TYPE_FIXNUM) {
104 fprintf(stderr, "substraction not supported for type %d\n", car->type); 145 fprintf(stderr, "error: sub not supported for type %d\n", car->type);
105 return NULL; 146 return obj_nil;
106 } 147 }
107 tot -= car->fixnum; 148 tot -= car->fixnum;
108 args = args->cdr; 149 args = args->cdr;
@@ -112,12 +153,27 @@ proc_sub(Object *args) {
112 153
113Object * 154Object *
114proc_mul(Object *args) { 155proc_mul(Object *args) {
115 ssize_t tot = 1; 156 // Extract first parameter.
157 Object *car = eval(args->car);
158 if (car == NULL) {
159 fprintf(stderr, "error: not enough arguments\n");
160 return obj_nil;
161 }
162 if (car->type != OBJ_TYPE_FIXNUM) {
163 fprintf(stderr, "error: mult not supported for type %d\n", car->type);
164 return obj_nil;
165 }
166 args = args->cdr;
167 ssize_t tot = car->fixnum;
168
116 while (args->type == OBJ_TYPE_PAIR) { 169 while (args->type == OBJ_TYPE_PAIR) {
117 Object *car = eval(args->car); 170 Object *car = eval(args->car);
171 if (car == NULL) {
172 car = obj_nil;
173 }
118 if (car->type != OBJ_TYPE_FIXNUM) { 174 if (car->type != OBJ_TYPE_FIXNUM) {
119 fprintf(stderr, "multiply not supported for type %d\n", car->type); 175 fprintf(stderr, "error: mult not supported for type %d\n", car->type);
120 return NULL; 176 return obj_nil;
121 } 177 }
122 tot *= car->fixnum; 178 tot *= car->fixnum;
123 args = args->cdr; 179 args = args->cdr;
@@ -127,21 +183,27 @@ proc_mul(Object *args) {
127 183
128Object * 184Object *
129proc_div(Object *args) { 185proc_div(Object *args) {
130 if (args->type != OBJ_TYPE_PAIR) {
131 fprintf(stderr, "substraction not supported for type %d\n", args->type);
132 return NULL;
133 }
134
135 // Extract first parameter. 186 // Extract first parameter.
136 Object *car = eval(args->car); 187 Object *car = eval(args->car);
188 if (car == NULL) {
189 fprintf(stderr, "error: not enough arguments\n");
190 return obj_nil;
191 }
137 args = args->cdr; 192 args = args->cdr;
138 ssize_t tot = car->fixnum; 193 ssize_t tot = car->fixnum;
139 194
140 while (args->type == OBJ_TYPE_PAIR) { 195 while (args->type == OBJ_TYPE_PAIR) {
141 Object *car = eval(args->car); 196 Object *car = eval(args->car);
197 if (car == NULL) {
198 car = obj_nil;
199 }
142 if (car->type != OBJ_TYPE_FIXNUM) { 200 if (car->type != OBJ_TYPE_FIXNUM) {
143 fprintf(stderr, "div not supported for type %d\n", car->type); 201 fprintf(stderr, "error: div not supported for type %d\n", car->type);
144 return NULL; 202 return obj_nil;
203 }
204 if (car->fixnum == 0) {
205 fprintf(stderr, "error: division by zero\n");
206 return obj_nil;
145 } 207 }
146 tot /= car->fixnum; 208 tot /= car->fixnum;
147 args = args->cdr; 209 args = args->cdr;
@@ -149,3 +211,13 @@ proc_div(Object *args) {
149 return make_fixnum(tot); 211 return make_fixnum(tot);
150} 212}
151 213
214Object *
215proc_display(Object *args) {
216 if (args == NULL) {
217 return obj_nil;
218 }
219 if (args->type == OBJ_TYPE_PAIR) {
220 display(eval(args->car));
221 }
222 return obj_nil;
223}