altos/lisp: Do better checking for un-evaluated macros in ROM
[fw/altos] / src / lisp / ao_lisp_lambda.c
index c53a38fd687f99533d4e7075082967ce99e87bde..8b7617144b61d4625ab56d0719f46fcc2b92826b 100644 (file)
@@ -47,6 +47,7 @@ const struct ao_lisp_type ao_lisp_lambda_type = {
        .size = lambda_size,
        .mark = lambda_mark,
        .move = lambda_move,
+       .name = "lambda",
 };
 
 void
@@ -68,7 +69,9 @@ ao_lisp_lambda_print(ao_poly poly)
 ao_poly
 ao_lisp_lambda_alloc(struct ao_lisp_cons *code, int args)
 {
+       ao_lisp_cons_stash(0, code);
        struct ao_lisp_lambda   *lambda = ao_lisp_alloc(sizeof (struct ao_lisp_lambda));
+       code = ao_lisp_cons_fetch(0);
        struct ao_lisp_cons     *arg;
        int                     f;
 
@@ -91,7 +94,7 @@ ao_lisp_lambda_alloc(struct ao_lisp_cons *code, int args)
        lambda->type = AO_LISP_LAMBDA;
        lambda->args = args;
        lambda->code = ao_lisp_cons_poly(code);
-       lambda->frame = ao_lisp_frame_poly(ao_lisp_frame_current);
+       lambda->frame = ao_lisp_frame_mark(ao_lisp_frame_current);
        DBGI("build frame: "); DBG_POLY(lambda->frame); DBG("\n");
        DBG_STACK();
        return ao_lisp_lambda_poly(lambda);
@@ -165,6 +168,7 @@ ao_lisp_lambda_eval(void)
                        args = ao_lisp_poly_cons(args->cdr);
                        vals = ao_lisp_poly_cons(vals->cdr);
                }
+               ao_lisp_cons_free(cons);
                break;
        }
        case AO_LISP_FUNC_LEXPR:
@@ -175,7 +179,7 @@ ao_lisp_lambda_eval(void)
                next_frame->vals[0].val = cons->cdr;
                break;
        }
-       next_frame->next = lambda->frame;
+       next_frame->prev = lambda->frame;
        DBGI("eval frame: "); DBG_POLY(ao_lisp_frame_poly(next_frame)); DBG("\n");
        ao_lisp_frame_current = next_frame;
        ao_lisp_stack->frame = ao_lisp_frame_poly(ao_lisp_frame_current);