aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/environment.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/bootstrap/environment.h')
-rw-r--r--src/bootstrap/environment.h34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/bootstrap/environment.h b/src/bootstrap/environment.h
new file mode 100644
index 0000000..cc13921
--- /dev/null
+++ b/src/bootstrap/environment.h
@@ -0,0 +1,34 @@
1#ifndef BDL_ENVIRONMENT_H
2#define BDL_ENVIRONMENT_H
3
4#include "objects.h"
5
6typedef struct EnvEntry {
7 Object *symbol;
8 Object *value;
9} EnvEntry;
10
11typedef struct Environment {
12 struct Environment *parent;
13 EnvEntry *buf;
14 size_t size;
15 size_t cap;
16 bool marked;
17} Environment;
18
19Environment * env_create(Environment *parent);
20void env_add_symbol(Environment *env, Object *symbol, Object *value);
21Object * env_lookup(Environment *env, Object *symbol);
22Object * env_update(Environment *env, Object *symbol, Object *value);
23ssize_t env_index_current(Environment *env, Object *symbol);
24void env_add_or_update_current(Environment *env, Object *symbol, Object *value);
25Environment * env_extend(Environment *parent, Environment *extra);
26
27#define MAKE_ENV_VAR(ENV,STR,VAR) \
28 (env_add_symbol((ENV), MAKE_SYM(STR), (VAR)))
29#define MAKE_ENV_PROC(ENV,STR,FUN) \
30 (env_add_symbol((ENV), MAKE_SYM(STR), make_procedure(FUN)))
31
32#define ENV_BUF_CAP 8
33
34#endif // BDL_ENVIRONMENT_H