altos/lisp: Add 'else' sematics to cond
authorKeith Packard <keithp@keithp.com>
Fri, 17 Nov 2017 02:41:18 +0000 (18:41 -0800)
committerKeith Packard <keithp@keithp.com>
Fri, 17 Nov 2017 02:41:18 +0000 (18:41 -0800)
Signed-off-by: Keith Packard <keithp@keithp.com>
src/lisp/ao_lisp.h
src/lisp/ao_lisp_eval.c
src/lisp/ao_lisp_make_const.c

index cd002cc2e110770cbbd407918b9a862288fb987f..9a48a44554d119249559ca8993855353894d2897 100644 (file)
@@ -68,6 +68,7 @@ extern uint8_t ao_lisp_const[AO_LISP_POOL_CONST] __attribute__((aligned(4)));
 #define _ao_lisp_atom_last     _atom(last)
 #define _ao_lisp_atom_length   _atom(length)
 #define _ao_lisp_atom_cond     _atom(cond)
+#define _ao_lisp_atom_else     _atom(else)
 #define _ao_lisp_atom_lambda   _atom(lambda)
 #define _ao_lisp_atom_led      _atom(led)
 #define _ao_lisp_atom_delay    _atom(delay)
index b6cb4fd83cd6400c9bb3caac222dba08c5415af8..57227e9338d3c9a095da4ad430e9bc1ae10a61cc 100644 (file)
@@ -324,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;
@@ -492,6 +494,9 @@ const char *ao_lisp_state_names[] = {
        "cond",
        "cond_test",
        "progn",
+       "while",
+       "while_test",
+       "macro",
 };
 
 /*
index 02cfa67ebcc6ad6feabbf0a27a219b6b16a0b814..826c98b948e829acefbee5d02cf49c62faa634fb 100644 (file)
@@ -304,6 +304,9 @@ main(int argc, char **argv)
        ao_lisp_atom_set(ao_lisp_atom_poly(a),
                         ao_lisp_atom_poly(a));
 
+       /* 'else' */
+       a = ao_lisp_atom_intern("else");
+
        if (argv[optind]){
                in = fopen(argv[optind], "r");
                if (!in) {