altos/lisp: Add 'else' sematics to cond
[fw/altos] / src / lisp / ao_lisp_eval.c
index 3e68d14af3c73734738d724538fe614e9b5ee673..57227e9338d3c9a095da4ad430e9bc1ae10a61cc 100644 (file)
@@ -107,6 +107,7 @@ ao_lisp_eval_sexpr(void)
                DBGI("..frame "); DBG_POLY(ao_lisp_frame_poly(ao_lisp_frame_current)); DBG("\n");
                ao_lisp_v = ao_lisp_atom_get(ao_lisp_v);
                /* fall through */
+       case AO_LISP_BOOL:
        case AO_LISP_INT:
        case AO_LISP_STRING:
        case AO_LISP_BUILTIN:
@@ -323,6 +324,8 @@ ao_lisp_eval_cond(void)
                        return 0;
                }
                ao_lisp_v = ao_lisp_poly_cons(ao_lisp_v)->car;
+               if (ao_lisp_v == _ao_lisp_atom_else)
+                       ao_lisp_v = _ao_lisp_bool_true;
                ao_lisp_stack->state = eval_cond_test;
                if (!ao_lisp_stack_push())
                        return 0;
@@ -345,7 +348,7 @@ ao_lisp_eval_cond_test(void)
        DBGI("cond_test: "); DBG_POLY(ao_lisp_v); DBG(" sexprs "); DBG_POLY(ao_lisp_stack->sexprs); DBG("\n");
        DBGI(".. frame "); DBG_POLY(ao_lisp_frame_poly(ao_lisp_frame_current)); DBG("\n");
        DBGI(".. saved frame "); DBG_POLY(ao_lisp_stack->frame); DBG("\n");
-       if (ao_lisp_v) {
+       if (ao_lisp_v != _ao_lisp_bool_false) {
                struct ao_lisp_cons *car = ao_lisp_poly_cons(ao_lisp_poly_cons(ao_lisp_stack->sexprs)->car);
                ao_poly c = car->cdr;
 
@@ -432,7 +435,7 @@ ao_lisp_eval_while_test(void)
        DBGI(".. frame "); DBG_POLY(ao_lisp_frame_poly(ao_lisp_frame_current)); DBG("\n");
        DBGI(".. saved frame "); DBG_POLY(ao_lisp_stack->frame); DBG("\n");
 
-       if (ao_lisp_v) {
+       if (ao_lisp_v != _ao_lisp_bool_false) {
                ao_lisp_stack->values = ao_lisp_v;
                ao_lisp_v = ao_lisp_poly_cons(ao_lisp_stack->sexprs)->cdr;
                ao_lisp_stack->state = eval_while;
@@ -491,6 +494,9 @@ const char *ao_lisp_state_names[] = {
        "cond",
        "cond_test",
        "progn",
+       "while",
+       "while_test",
+       "macro",
 };
 
 /*