- while (cons) {
- DBG("add formal: "); DBG_POLY(v); DBG("\n");
-
- /* We've processed the first element of the list, go check
- * what kind of function we've got
- */
- if (formals == NULL) {
- 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;
- }
- } else {
- switch (func_type(v)) {
- case _ao_lisp_atom_lambda:
- case _ao_lisp_atom_lexpr:
- break;
- case _ao_lisp_atom_nlambda:
- formals = actuals;
- goto eval;
- case _ao_lisp_atom_macro:
- break;
- default:
- ao_lisp_error(AO_LISP_INVALID, "operator is not a function");
- goto bail;
- }
+ case eval_formal:
+ /* Check what kind of function we've got */
+ if (!stack->formals) {
+ switch (func_type(ao_lisp_v)) {
+ case AO_LISP_LAMBDA:
+ case _ao_lisp_atom_lambda:
+ case AO_LISP_LEXPR:
+ case _ao_lisp_atom_lexpr:
+ DBGI(".. lambda or lexpr\n");
+ break;
+ case AO_LISP_MACRO:
+ case _ao_lisp_atom_macro:
+ stack->macro = 1;
+ case AO_LISP_NLAMBDA:
+ case _ao_lisp_atom_nlambda:
+ DBGI(".. nlambda or macro\n");
+ stack->formals = stack->actuals;
+ stack->state = eval_exec_direct;
+ break;