summaryrefslogtreecommitdiff
path: root/src/lisp/ao_lisp_cons.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-11-17 22:14:19 -0800
committerKeith Packard <keithp@keithp.com>2017-11-17 22:14:19 -0800
commite1acf5eb12aceda7aa838df031c1da1129d0fa5d (patch)
treee0fe6c04b9f3f654e246616a78d1278e5d6c3cf5 /src/lisp/ao_lisp_cons.c
parenta4e18a13029cc7b16b2ed9da84d6e606bc725ac3 (diff)
altos/lisp: Add apply
And all of the library routines that use it, map, string-map and friends. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/lisp/ao_lisp_cons.c')
-rw-r--r--src/lisp/ao_lisp_cons.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/lisp/ao_lisp_cons.c b/src/lisp/ao_lisp_cons.c
index 81a16a7a..8d607372 100644
--- a/src/lisp/ao_lisp_cons.c
+++ b/src/lisp/ao_lisp_cons.c
@@ -19,10 +19,16 @@ static void cons_mark(void *addr)
struct ao_lisp_cons *cons = addr;
for (;;) {
+ ao_poly cdr = cons->cdr;
+
ao_lisp_poly_mark(cons->car, 1);
- cons = ao_lisp_poly_cons(cons->cdr);
- if (!cons)
+ if (!cdr)
break;
+ if (ao_lisp_poly_type(cdr) != AO_LISP_CONS) {
+ ao_lisp_poly_mark(cdr, 1);
+ break;
+ }
+ cons = ao_lisp_poly_cons(cdr);
if (ao_lisp_mark_memory(&ao_lisp_cons_type, cons))
break;
}
@@ -42,23 +48,29 @@ static void cons_move(void *addr)
return;
for (;;) {
- struct ao_lisp_cons *cdr;
- int ret;
+ ao_poly cdr;
+ struct ao_lisp_cons *c;
+ int ret;
MDBG_MOVE("cons_move start %d (%d, %d)\n",
MDBG_OFFSET(cons), MDBG_OFFSET(ao_lisp_ref(cons->car)), MDBG_OFFSET(ao_lisp_ref(cons->cdr)));
(void) ao_lisp_poly_move(&cons->car, 1);
- cdr = ao_lisp_poly_cons(cons->cdr);
+ cdr = cons->cdr;
if (!cdr)
break;
- ret = ao_lisp_move_memory(&ao_lisp_cons_type, (void **) &cdr);
- if (cdr != ao_lisp_poly_cons(cons->cdr))
- cons->cdr = ao_lisp_cons_poly(cdr);
+ if (ao_lisp_poly_type(cdr) != AO_LISP_CONS) {
+ (void) ao_lisp_poly_move(&cons->cdr, 1);
+ break;
+ }
+ c = ao_lisp_poly_cons(cdr);
+ ret = ao_lisp_move_memory(&ao_lisp_cons_type, (void **) &c);
+ if (c != ao_lisp_poly_cons(cons->cdr))
+ cons->cdr = ao_lisp_cons_poly(c);
MDBG_MOVE("cons_move end %d (%d, %d)\n",
MDBG_OFFSET(cons), MDBG_OFFSET(ao_lisp_ref(cons->car)), MDBG_OFFSET(ao_lisp_ref(cons->cdr)));
if (ret)
break;
- cons = cdr;
+ cons = c;
}
}