#ifndef BDL_ENVIRONMENT_H #define BDL_ENVIRONMENT_H #include "objects.h" typedef struct EnvEntry { Object *symbol; Object *value; } EnvEntry; typedef struct Environment { struct Environment *parent; EnvEntry *buf; size_t size; size_t cap; bool marked; } Environment; Environment * env_create(Environment *parent); void env_add_symbol(Environment *env, Object *symbol, Object *value); Object * env_lookup(Environment *env, Object *symbol); Object * env_update(Environment *env, Object *symbol, Object *value); ssize_t env_index_current(Environment *env, Object *symbol); void env_add_or_update_current(Environment *env, Object *symbol, Object *value); Environment * env_extend(Environment *parent, Environment *extra); #define MAKE_ENV_VAR(ENV,STR,VAR) \ (env_add_symbol((ENV), MAKE_SYM(STR), (VAR))) #define MAKE_ENV_PROC(ENV,STR,FUN) \ (env_add_symbol((ENV), MAKE_SYM(STR), make_procedure(FUN))) #define ENV_BUF_CAP 8 #endif // BDL_ENVIRONMENT_H