- }
-
- /* Build stack frames for each list */
- while (ao_lisp_poly_type(v) == AO_LISP_CONS) {
- if (v == AO_LISP_NIL)
- break;
-
- /* Push existing bits on the stack */
- if (cons++)
- if (!ao_lisp_stack_push())
- goto bail;
-
- actuals = ao_lisp_poly_cons(v);
- formals = NULL;
- formals_tail = NULL;
- save_cond = cond;
- cond = NULL;
-
- v = actuals->car;
-
-// DBG("start: stack"); DBG_CONS(stack); DBG("\n");
-// DBG("start: actuals"); DBG_CONS(actuals); DBG("\n");
-// DBG("start: formals"); DBG_CONS(formals); DBG("\n");
- }
-
- if (ao_lisp_poly_type(v) == AO_LISP_BUILTIN) {
- struct ao_lisp_builtin *b = ao_lisp_poly_builtin(v);
- switch (b->args) {
- case AO_LISP_NLAMBDA:
- formals = actuals;
- goto eval;
-
- 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_error(AO_LISP_INVALID, "macro didn't return list");
- goto bail;
- }
- /* Reset frame to the new list */
- actuals = ao_lisp_poly_cons(v);
- v = actuals->car;
- goto restart;
- }
- /* Evaluate primitive types */
-
- DBG ("actual: "); DBG_POLY(v); DBG("\n");
-
- switch (ao_lisp_poly_type(v)) {
- case AO_LISP_INT:
- case AO_LISP_STRING:
- break;
- case AO_LISP_ATOM:
- v = ao_lisp_atom_get(v);