#include "eval.h" #include "env.h" #include static void eval_atom(am_t *am) { switch (am->expr->atom.type) { case ATOM_TYPE_EMPTY_LIST: case ATOM_TYPE_INTEGER: case ATOM_TYPE_PRIM_PROC: am->val = am->expr; break; case ATOM_TYPE_SYMBOL: env_fetch(am); break; } } static void eval_list(am_t *am) { am->argl = am->expr->pair.cdr; am->expr = am->expr->pair.car; assert(am->expr->is_atom); assert(am->expr->atom.type == ATOM_TYPE_SYMBOL); env_fetch(am); assert(am->val->is_atom); assert(am->val->atom.type == ATOM_TYPE_PRIM_PROC); assert(am->val->atom.prim_proc != NULL); am->val->atom.prim_proc(am); } void eval(am_t *am) { if (am->expr->is_atom) eval_atom(am); else eval_list(am); }