diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bootstrap/environment.c | 21 | ||||
-rwxr-xr-x | src/bootstrap/main.c | 3 | ||||
-rw-r--r-- | src/bootstrap/primitives.c | 5 |
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 | ||
10 | typedef 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 |
11 | static EnvSymbol environment[ENV_SIZE]; | 18 | static EnvSymbol environment[ENV_SIZE]; |
12 | static size_t env_n = 0; | 19 | static size_t env_n = 0; |
13 | 20 | ||
14 | Object * | 21 | Object * |
15 | find_environment_symbol(Object *symbol) { | 22 | env_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 | |||
31 | Environment * | ||
32 | env_create(Environment *parent) { | ||
33 | // TODO: calloc env and assign parent. | ||
21 | return NULL; | 34 | return NULL; |
22 | } | 35 | } |
23 | 36 | ||
37 | void | ||
38 | env_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 |