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>2017-02-20 11:16:49 -0800
commitd2408e72d1e0d3459918601712b09860ab17e200 (patch)
tree5405e41249373e4d174e61e157ee30d00f145c8d /src/lisp/ao_lisp_rep.c
parente2f4d25cd6f6f3787d4ee99264732d5b2ce23d4c (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;
+}