From 0ced351c8f4449f7086b04e42c822d649f040d1f Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Thu, 16 Nov 2017 18:41:18 -0800 Subject: [PATCH] altos/lisp: Add 'else' sematics to cond Signed-off-by: Keith Packard --- src/lisp/ao_lisp.h | 1 + src/lisp/ao_lisp_eval.c | 5 +++++ src/lisp/ao_lisp_make_const.c | 3 +++ 3 files changed, 9 insertions(+) diff --git a/src/lisp/ao_lisp.h b/src/lisp/ao_lisp.h index cd002cc2..9a48a445 100644 --- a/src/lisp/ao_lisp.h +++ b/src/lisp/ao_lisp.h @@ -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) diff --git a/src/lisp/ao_lisp_eval.c b/src/lisp/ao_lisp_eval.c index b6cb4fd8..57227e93 100644 --- a/src/lisp/ao_lisp_eval.c +++ b/src/lisp/ao_lisp_eval.c @@ -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", }; /* diff --git a/src/lisp/ao_lisp_make_const.c b/src/lisp/ao_lisp_make_const.c index 02cfa67e..826c98b9 100644 --- a/src/lisp/ao_lisp_make_const.c +++ b/src/lisp/ao_lisp_make_const.c @@ -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) { -- 2.30.2