// Returns a newly created environment frame. static Obj *push_env(Obj *env, Obj *vars, Obj *values) { if (list_length(vars) != list_length(values)) error("Cannot apply function: number of argument does not match"); Obj *map = Nil; for (Obj *p = vars, *q = values; p != Nil; p = p->cdr, q = q->cdr) { Obj *sym = p->car; Obj *val = q->car; map = acons(sym, val, map); } return make_env(map, env); }