case AO_LISP_STRING:
break;
case AO_LISP_ATOM:
- v = ao_lisp_poly_atom(v)->val;
+ v = ao_lisp_atom_get(v);
break;
}
case AO_LISP_MACRO:
v = ao_lisp_func(b)(ao_lisp_poly_cons(actuals->cdr));
+ DBG("macro "); DBG_POLY(ao_lisp_cons_poly(actuals));
+ DBG(" -> "); DBG_POLY(v);
+ DBG("\n");
if (ao_lisp_poly_type(v) != AO_LISP_CONS) {
ao_lisp_exception |= AO_LISP_INVALID;
return AO_LISP_NIL;
DBG ("\n");
} else {
ao_lisp_exception |= AO_LISP_INVALID;
- return AO_LISP_NIL;
}
+ if (ao_lisp_exception)
+ return AO_LISP_NIL;
done_eval:
if (--cons) {
struct ao_lisp_cons *frame;
frame = ao_lisp_poly_cons(stack->car);
actuals = ao_lisp_poly_cons(frame->car);
formals = ao_lisp_poly_cons(frame->cdr);
+ formals_tail = NULL;
/* Recompute the tail of the formals list */
- for (formal = formals; formal->cdr != AO_LISP_NIL; formal = ao_lisp_poly_cons(formal->cdr));
- formals_tail = formal;
+ if (formals) {
+ for (formal = formals; formal->cdr != AO_LISP_NIL; formal = ao_lisp_poly_cons(formal->cdr));
+ formals_tail = formal;
+ }
stack = ao_lisp_poly_cons(stack->cdr);
DBG("stack pop: stack"); DBG_CONS(stack); DBG("\n");
DBG("stack pop: actuals"); DBG_CONS(actuals); DBG("\n");
DBG("stack pop: formals"); DBG_CONS(formals); DBG("\n");
} else {
+ actuals = 0;
+ formals = 0;
+ formals_tail = 0;
DBG("done func\n");
break;
}