+ 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:
+ v = ao_lisp_func(b)(ao_lisp_poly_cons(actuals->cdr));
+ goto done_eval;
+
+ case AO_LISP_MACRO:
+ v = ao_lisp_func(b)(ao_lisp_poly_cons(actuals->cdr));
+ if (ao_lisp_poly_type(v) != AO_LISP_CONS) {
+ ao_lisp_exception |= AO_LISP_INVALID;
+ return AO_LISP_NIL;
+ }
+
+ /* Reset frame to the new list */
+ actuals = ao_lisp_poly_cons(v);
+ v = actuals->car;
+ goto restart;
+ }
+ }
+ }
+
+ formal = ao_lisp_cons_cons(v, NULL);