From c497aca556295479b1ed5632e125ff1d0658d8d8 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 11 Oct 2021 09:40:39 +0200 Subject: Add a base struct to start environment refactoring --- src/bootstrap/environment.c | 21 ++++++++++++++++++++- src/bootstrap/main.c | 3 +++ 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 { Object *value; } EnvSymbol; +typedef struct Environment { + struct Environment *parent; + EnvSymbol *memory; + size_t size; + size_t capacity; +} Environment; + #define ENV_SIZE 256 static EnvSymbol environment[ENV_SIZE]; static size_t env_n = 0; Object * -find_environment_symbol(Object *symbol) { +env_find_symbol(Object *symbol) { for (size_t i = 0; i < env_n; i++) { if (symbol_eq(environment[i].symbol, symbol)) { return environment[i].value; } } + return obj_nil; +} + +Environment * +env_create(Environment *parent) { + // TODO: calloc env and assign parent. return NULL; } +void +env_add_symbol(EnvSymbol symbol, Environment *env) { + // TODO: If empty allocate enough for one object. + // TODO: If full double the capacity and realloc. + // TODO: Put the symbol on the next slot available. +} 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) { environment[env_n++] = (EnvSymbol){MAKE_SYM("or"), make_procedure(proc_or)}; environment[env_n++] = (EnvSymbol){MAKE_SYM("if"), make_procedure(proc_if)}; environment[env_n++] = (EnvSymbol){MAKE_SYM("else"), obj_true}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("true"), obj_true}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("false"), obj_false}; + environment[env_n++] = (EnvSymbol){MAKE_SYM("nil"), obj_nil}; environment[env_n++] = (EnvSymbol){MAKE_SYM("cond"), make_procedure(proc_cond)}; environment[env_n++] = (EnvSymbol){MAKE_SYM("car"), make_procedure(proc_car)}; 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) { return root; } break; case OBJ_TYPE_SYMBOL: { - Object *value = find_environment_symbol(root); + Object *value = env_find_symbol(root); if (value == NULL) { printf("error: symbol not found: `"); display(root); @@ -73,7 +73,7 @@ eval(Object *root) { } break; case OBJ_TYPE_PAIR: { if (root->car->type == OBJ_TYPE_SYMBOL) { - Object *value = find_environment_symbol(root->car); + Object *value = env_find_symbol(root->car); if (value == NULL) { printf("error: symbol not found: `"); display(root->car); @@ -699,6 +699,7 @@ proc_equal(Object *args) { // TODO: fixnum left/right shift, mask, invert // TODO: implement and test missing procedures +// TODO: add primitives for type transforms: string->symbol, symbol->string, etc // TODO: properly implement nested environments // TODO: implement support for quotes and semi-quotes // TODO: LAMBDA -- cgit v1.2.1