summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_poly.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_poly.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_poly.c')
-rw-r--r--src/lisp/ao_lisp_poly.c89
1 files changed, 2 insertions, 87 deletions
diff --git a/src/lisp/ao_lisp_poly.c b/src/lisp/ao_lisp_poly.c
index 1855d945..c6ca0a97 100644
--- a/src/lisp/ao_lisp_poly.c
+++ b/src/lisp/ao_lisp_poly.c
@@ -14,91 +14,7 @@
#include "ao_lisp.h"
-enum math_op { math_plus, math_minus, math_times, math_divide, math_mod };
-
-ao_lisp_poly
-ao_lisp_math(struct ao_lisp_cons *cons, enum math_op op)
-{
- ao_lisp_poly ret = AO_LISP_NIL;
-
- while (cons) {
- ao_lisp_poly car = cons->car;
- uint8_t rt = ao_lisp_poly_type(ret);
- uint8_t ct = ao_lisp_poly_type(car);
-
- cons = cons->cdr;
-
- if (rt == AO_LISP_NIL)
- ret = car;
-
- else if (rt == AO_LISP_INT && ct == AO_LISP_INT) {
- int r = ao_lisp_poly_int(ret);
- int c = ao_lisp_poly_int(car);
-
- switch(op) {
- case math_plus:
- r += c;
- break;
- case math_minus:
- r -= c;
- break;
- case math_times:
- r *= c;
- break;
- case math_divide:
- if (c == 0)
- return AO_LISP_NIL;
- r /= c;
- break;
- case math_mod:
- if (c == 0)
- return AO_LISP_NIL;
- r %= c;
- break;
- }
- ret = ao_lisp_int_poly(r);
- }
-
- else if (rt == AO_LISP_STRING && ct == AO_LISP_STRING && op == math_plus)
- ret = ao_lisp_string_poly(ao_lisp_string_cat(ao_lisp_poly_string(ret),
- ao_lisp_poly_string(car)));
- else {
- /* XXX exception */
- return AO_LISP_NIL;
- }
- }
- return ret;
-}
-
-ao_lisp_poly
-ao_lisp_plus(struct ao_lisp_cons *cons)
-{
- return ao_lisp_math(cons, math_plus);
-}
-
-ao_lisp_poly
-ao_lisp_minus(struct ao_lisp_cons *cons)
-{
- return ao_lisp_math(cons, math_minus);
-}
-
-ao_lisp_poly
-ao_lisp_times(struct ao_lisp_cons *cons)
-{
- return ao_lisp_math(cons, math_times);
-}
-
-ao_lisp_poly
-ao_lisp_divide(struct ao_lisp_cons *cons)
-{
- return ao_lisp_math(cons, math_divide);
-}
-
-ao_lisp_poly
-ao_lisp_mod(struct ao_lisp_cons *cons)
-{
- return ao_lisp_math(cons, math_mod);
-}
+/*
static const struct ao_lisp_builtin builtin_plus = {
.type = AO_LISP_BUILTIN,
@@ -113,7 +29,6 @@ static const struct ao_lisp_atom atom_plus = {
.name = "plus"
};
-/*
static const struct ao_lisp_builtin builtin_minus = {
.type = AO_LISP_BUILTIN,
.func = ao_lisp_minus
@@ -124,9 +39,9 @@ static const struct ao_lisp_builtin builtin_times = {
.func = ao_lisp_times
};
-*/
const struct ao_lisp_atom const *ao_lisp_builtins[] = {
&atom_plus,
0
};
+*/