diff options
Diffstat (limited to 'src/lisp/ao_lisp_cons.c')
-rw-r--r-- | src/lisp/ao_lisp_cons.c | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/lisp/ao_lisp_cons.c b/src/lisp/ao_lisp_cons.c index d2b60c9a..81a16a7a 100644 --- a/src/lisp/ao_lisp_cons.c +++ b/src/lisp/ao_lisp_cons.c @@ -72,7 +72,7 @@ const struct ao_lisp_type ao_lisp_cons_type = { struct ao_lisp_cons *ao_lisp_cons_free_list; struct ao_lisp_cons * -ao_lisp_cons_cons(ao_poly car, struct ao_lisp_cons *cdr) +ao_lisp_cons_cons(ao_poly car, ao_poly cdr) { struct ao_lisp_cons *cons; @@ -81,18 +81,24 @@ ao_lisp_cons_cons(ao_poly car, struct ao_lisp_cons *cdr) ao_lisp_cons_free_list = ao_lisp_poly_cons(cons->cdr); } else { ao_lisp_poly_stash(0, car); - ao_lisp_cons_stash(0, cdr); + ao_lisp_poly_stash(1, cdr); cons = ao_lisp_alloc(sizeof (struct ao_lisp_cons)); car = ao_lisp_poly_fetch(0); - cdr = ao_lisp_cons_fetch(0); + cdr = ao_lisp_poly_fetch(1); if (!cons) return NULL; } cons->car = car; - cons->cdr = ao_lisp_cons_poly(cdr); + cons->cdr = cdr; return cons; } +ao_poly +ao_lisp__cons(ao_poly car, ao_poly cdr) +{ + return ao_lisp_cons_poly(ao_lisp_cons_cons(car, cdr)); +} + void ao_lisp_cons_free(struct ao_lisp_cons *cons) { @@ -114,8 +120,15 @@ ao_lisp_cons_print(ao_poly c) if (!first) printf(" "); ao_lisp_poly_print(cons->car); - cons = ao_lisp_poly_cons(cons->cdr); - first = 0; + c = cons->cdr; + if (ao_lisp_poly_type(c) == AO_LISP_CONS) { + cons = ao_lisp_poly_cons(c); + first = 0; + } else { + printf(" . "); + ao_lisp_poly_print(c); + cons = NULL; + } } printf(")"); } |