aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-11 09:40:39 +0200
committerBad Diode <bd@badd10de.dev>2021-10-11 09:40:39 +0200
commitc497aca556295479b1ed5632e125ff1d0658d8d8 (patch)
tree114aadd19644b32e2046241c4f3955b00de5422f
parent581116c655df4eb753098e013dd5854df95f7865 (diff)
downloadbdl-c497aca556295479b1ed5632e125ff1d0658d8d8.tar.gz
bdl-c497aca556295479b1ed5632e125ff1d0658d8d8.zip
Add a base struct to start environment refactoring
-rw-r--r--src/bootstrap/environment.c21
-rwxr-xr-xsrc/bootstrap/main.c3
-rw-r--r--src/bootstrap/primitives.c5
3 files changed, 26 insertions, 3 deletions
diff --git a/src/bootstrap/environment.c b/src/bootstrap/environment.c
index 4eda2ad..fca2449 100644
--- a/src/bootstrap/environment.c
+++ b/src/bootstrap/environment.c
@@ -7,17 +7,36 @@ typedef struct EnvSymbol {
7 Object *value; 7 Object *value;
8} EnvSymbol; 8} EnvSymbol;
9 9
10typedef struct Environment {
11 struct Environment *parent;
12 EnvSymbol *memory;
13 size_t size;
14 size_t capacity;
15} Environment;
16
10#define ENV_SIZE 256 17#define ENV_SIZE 256
11static EnvSymbol environment[ENV_SIZE]; 18static EnvSymbol environment[ENV_SIZE];
12static size_t env_n = 0; 19static size_t env_n = 0;
13 20
14Object * 21Object *
15find_environment_symbol(Object *symbol) { 22env_find_symbol(Object *symbol) {
16 for (size_t i = 0; i < env_n; i++) { 23 for (size_t i = 0; i < env_n; i++) {
17 if (symbol_eq(environment[i].symbol, symbol)) { 24 if (symbol_eq(environment[i].symbol, symbol)) {
18 return environment[i].value; 25 return environment[i].value;
19 } 26 }
20 } 27 }
28 return obj_nil;
29}
30
31Environment *
32env_create(Environment *parent) {
33 // TODO: calloc env and assign parent.
21 return NULL; 34 return NULL;
22} 35}
23 36
37void
38env_add_symbol(EnvSymbol symbol, Environment *env) {
39 // TODO: If empty allocate enough for one object.
40 // TODO: If full double the capacity and realloc.
41 // TODO: Put the symbol on the next slot available.
42}
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c
index 65e508f..66c3780 100755
--- a/src/bootstrap/main.c
+++ b/src/bootstrap/main.c
@@ -54,6 +54,9 @@ init(void) {
54 environment[env_n++] = (EnvSymbol){MAKE_SYM("or"), make_procedure(proc_or)}; 54 environment[env_n++] = (EnvSymbol){MAKE_SYM("or"), make_procedure(proc_or)};
55 environment[env_n++] = (EnvSymbol){MAKE_SYM("if"), make_procedure(proc_if)}; 55 environment[env_n++] = (EnvSymbol){MAKE_SYM("if"), make_procedure(proc_if)};
56 environment[env_n++] = (EnvSymbol){MAKE_SYM("else"), obj_true}; 56 environment[env_n++] = (EnvSymbol){MAKE_SYM("else"), obj_true};
57 environment[env_n++] = (EnvSymbol){MAKE_SYM("true"), obj_true};
58 environment[env_n++] = (EnvSymbol){MAKE_SYM("false"), obj_false};
59 environment[env_n++] = (EnvSymbol){MAKE_SYM("nil"), obj_nil};
57 environment[env_n++] = (EnvSymbol){MAKE_SYM("cond"), make_procedure(proc_cond)}; 60 environment[env_n++] = (EnvSymbol){MAKE_SYM("cond"), make_procedure(proc_cond)};
58 environment[env_n++] = (EnvSymbol){MAKE_SYM("car"), make_procedure(proc_car)}; 61 environment[env_n++] = (EnvSymbol){MAKE_SYM("car"), make_procedure(proc_car)};
59 environment[env_n++] = (EnvSymbol){MAKE_SYM("cdr"), make_procedure(proc_cdr)}; 62 environment[env_n++] = (EnvSymbol){MAKE_SYM("cdr"), make_procedure(proc_cdr)};
diff --git a/src/bootstrap/primitives.c b/src/bootstrap/primitives.c
index 806656e..3c03b99 100644
--- a/src/bootstrap/primitives.c
+++ b/src/bootstrap/primitives.c
@@ -62,7 +62,7 @@ eval(Object *root) {
62 return root; 62 return root;
63 } break; 63 } break;
64 case OBJ_TYPE_SYMBOL: { 64 case OBJ_TYPE_SYMBOL: {
65 Object *value = find_environment_symbol(root); 65 Object *value = env_find_symbol(root);
66 if (value == NULL) { 66 if (value == NULL) {
67 printf("error: symbol not found: `"); 67 printf("error: symbol not found: `");
68 display(root); 68 display(root);
@@ -73,7 +73,7 @@ eval(Object *root) {
73 } break; 73 } break;
74 case OBJ_TYPE_PAIR: { 74 case OBJ_TYPE_PAIR: {
75 if (root->car->type == OBJ_TYPE_SYMBOL) { 75 if (root->car->type == OBJ_TYPE_SYMBOL) {
76 Object *value = find_environment_symbol(root->car); 76 Object *value = env_find_symbol(root->car);
77 if (value == NULL) { 77 if (value == NULL) {
78 printf("error: symbol not found: `"); 78 printf("error: symbol not found: `");
79 display(root->car); 79 display(root->car);
@@ -699,6 +699,7 @@ proc_equal(Object *args) {
699 699
700// TODO: fixnum left/right shift, mask, invert 700// TODO: fixnum left/right shift, mask, invert
701// TODO: implement and test missing procedures 701// TODO: implement and test missing procedures
702// TODO: add primitives for type transforms: string->symbol, symbol->string, etc
702// TODO: properly implement nested environments 703// TODO: properly implement nested environments
703// TODO: implement support for quotes and semi-quotes 704// TODO: implement support for quotes and semi-quotes
704// TODO: LAMBDA 705// TODO: LAMBDA