#include "eval.h" #include "env.h" #include static void eval_atom(am_t *am) { switch (AM_EXPR(am)->atom.type) { case ATOM_TYPE_EMPTY_LIST: case ATOM_TYPE_INTEGER: case ATOM_TYPE_PRIM_PROC: am_assign(am, VAL, EXPR); break; case ATOM_TYPE_SYMBOL: env_fetch(am); break; } } static void eval_list(am_t *am) { AM_ARGL(am) = expr_empty_list(am); am_cdr(am, UNEV, EXPR); am_car(am, EXPR, EXPR); env_fetch(am); am_push(am, VAL); while (!AM_UNEV(am)->is_atom) { am_push(am, ARGL); am_car(am, EXPR, UNEV); am_cdr(am, UNEV, UNEV); am_push(am, UNEV); eval(am); am_pop(am, UNEV); am_pop(am, ARGL); am_append(am, ARGL, VAL); } am_pop(am, VAL); am_call(am, VAL); } void eval(am_t *am) { if (AM_EXPR(am)->is_atom) eval_atom(am); else eval_list(am); }