#ifndef AM_H #define AM_H #include "expr.h" #include "store.h" #define AM_STACK_SIZE 128U #define AM_ARGL(am) am->regs[ARGL] #define AM_ENV(am) am->regs[ENV] #define AM_EXPR(am) am->regs[EXPR] #define AM_UNEV(am) am->regs[UNEV] #define AM_VAL(am) am->regs[VAL] typedef enum { ARGL, ENV, EXPR, UNEV, VAL, AM_REG_COUNT, } am_reg_t; typedef struct am { expr_t *regs[AM_REG_COUNT]; expr_t **sp, *stack[AM_STACK_SIZE]; store_t store; } am_t; void am_init(am_t *am); void am_push(am_t *am, am_reg_t reg); void am_pop(am_t *am, am_reg_t reg); void am_append(am_t *am, am_reg_t list_reg, am_reg_t item_reg); void am_car(am_t *am, am_reg_t dest, am_reg_t src); void am_cdr(am_t *am, am_reg_t dest, am_reg_t src); void am_assign(am_t *am, am_reg_t dest, am_reg_t src); void am_call(am_t *am, am_reg_t proc); #endif