summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_rep.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2016-11-01 21:14:45 -0700
committerKeith Packard <keithp@keithp.com>2016-11-17 22:18:39 -0800
commit338723847e66f7c34a6b5e54d094ed52dc5665c3 (patch)
treec53d501a9e5f29d84c8c4ab65d7198b0e5e14b12 /src/lisp/ao_lisp_rep.c
parent75f07353a4fad170ac1cc6af98ed1aad7d1c0c88 (diff)
altos/lisp: Change lisp objects to use ao_poly everywhere. Add const
This makes all lisp objects use 16-bit ints for references so we can hold more stuff in small amounts of memory. Also adds a separate constant pool of lisp objects for builtins, initial atoms and constant lisp code. Now builds (and runs!) on the nucleo-32 boards. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_rep.c')
-rw-r--r--src/lisp/ao_lisp_rep.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/lisp/ao_lisp_rep.c b/src/lisp/ao_lisp_rep.c
new file mode 100644
index 00000000..d26d270c
--- /dev/null
+++ b/src/lisp/ao_lisp_rep.c
@@ -0,0 +1,40 @@
+/*
+ * Copyright © 2016 Keith Packard <keithp@keithp.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ */
+
+#include "ao_lisp.h"
+
+ao_poly
+ao_lisp_read_eval_print(void)
+{
+ ao_poly in, out = AO_LISP_NIL;
+ for(;;) {
+ in = ao_lisp_read();
+ if (!in)
+ break;
+ out = ao_lisp_eval(in);
+ if (ao_lisp_exception) {
+ if (ao_lisp_exception & AO_LISP_OOM)
+ printf("out of memory\n");
+ if (ao_lisp_exception & AO_LISP_DIVIDE_BY_ZERO)
+ printf("divide by zero\n");
+ if (ao_lisp_exception & AO_LISP_INVALID)
+ printf("invalid operation\n");
+ ao_lisp_exception = 0;
+ } else {
+ ao_lisp_poly_print(out);
+ putchar ('\n');
+ }
+ }
+ return out;
+}