]> git.gag.com Git - fw/altos/blobdiff - src/lisp/ao_lisp_eval.c
altos/lisp: Separate out values from atoms
[fw/altos] / src / lisp / ao_lisp_eval.c
index b13d4681480b74b96e2bad5e75260e9e5c1dc459..6eef1f23d148f08c1b5ac4c094be412b472ef209 100644 (file)
@@ -91,7 +91,7 @@ ao_lisp_eval(ao_poly v)
                case AO_LISP_STRING:
                        break;
                case AO_LISP_ATOM:
-                       v = ao_lisp_poly_atom(v)->val;
+                       v = ao_lisp_atom_get(v);
                        break;
                }
 
@@ -111,6 +111,9 @@ ao_lisp_eval(ao_poly v)
 
                                        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;
@@ -160,8 +163,9 @@ ao_lisp_eval(ao_poly v)
                                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;
@@ -170,16 +174,22 @@ ao_lisp_eval(ao_poly v)
                                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;
                        }