altos/scheme: ao_scheme__cons -> ao_scheme_cons
[fw/altos] / src / scheme / ao_scheme_cons.c
index 02512e15f895ab36aa46a2dbf1ccb9aa56df4d7f..d40c2826d837d1c9e66152fa1b194d2f960658bf 100644 (file)
@@ -24,8 +24,8 @@ static void cons_mark(void *addr)
                ao_scheme_poly_mark(cons->car, 1);
                if (!cdr)
                        break;
-               if (ao_scheme_poly_type(cdr) != AO_SCHEME_CONS) {
-                       ao_scheme_poly_mark(cdr, 1);
+               if (!AO_SCHEME_IS_CONS(cdr)) {
+                       ao_scheme_poly_mark(cdr, 0);
                        break;
                }
                cons = ao_scheme_poly_cons(cdr);
@@ -58,7 +58,7 @@ static void cons_move(void *addr)
                cdr = cons->cdr;
                if (!cdr)
                        break;
-               if (ao_scheme_poly_base_type(cdr) != AO_SCHEME_CONS) {
+               if (!AO_SCHEME_IS_CONS(cdr)) {
                        (void) ao_scheme_poly_move(&cons->cdr, 0);
                        break;
                }
@@ -111,7 +111,7 @@ ao_scheme_cons_cdr(struct ao_scheme_cons *cons)
        ao_poly cdr = cons->cdr;
        if (cdr == AO_SCHEME_NIL)
                return NULL;
-       if (ao_scheme_poly_type(cdr) != AO_SCHEME_CONS) {
+       if (!AO_SCHEME_IS_CONS(cdr)) {
                (void) ao_scheme_error(AO_SCHEME_INVALID, "improper cdr %v", cdr);
                return NULL;
        }
@@ -119,7 +119,7 @@ ao_scheme_cons_cdr(struct ao_scheme_cons *cons)
 }
 
 ao_poly
-ao_scheme__cons(ao_poly car, ao_poly cdr)
+ao_scheme_cons(ao_poly car, ao_poly cdr)
 {
        return ao_scheme_cons_poly(ao_scheme_cons_cons(car, cdr));
 }
@@ -151,7 +151,7 @@ ao_scheme_cons_copy(struct ao_scheme_cons *cons)
                        tail->cdr = ao_scheme_cons_poly(new);
                tail = new;
                cdr = cons->cdr;
-               if (ao_scheme_poly_type(cdr) != AO_SCHEME_CONS) {
+               if (!AO_SCHEME_IS_CONS(cdr)) {
                        tail->cdr = cdr;
                        break;
                }
@@ -175,52 +175,51 @@ ao_scheme_cons_free(struct ao_scheme_cons *cons)
 }
 
 void
-ao_scheme_cons_write(ao_poly c)
+ao_scheme_cons_write(ao_poly c, bool write)
 {
        struct ao_scheme_cons   *cons = ao_scheme_poly_cons(c);
+       struct ao_scheme_cons   *clear = cons;
        ao_poly                 cdr;
-       int                     first = 1;
+       int                     written = 0;
 
+       ao_scheme_print_start();
        printf("(");
        while (cons) {
-               if (!first)
+               if (written != 0)
                        printf(" ");
-               ao_scheme_poly_write(cons->car);
-               cdr = cons->cdr;
-               if (cdr == c) {
-                       printf(" ...");
+
+               /* Note if there's recursion in printing. Not
+                * as good as actual references, but at least
+                * we don't infinite loop...
+                */
+               if (ao_scheme_print_mark_addr(cons)) {
+                       printf("...");
                        break;
                }
-               if (ao_scheme_poly_type(cdr) == AO_SCHEME_CONS) {
-                       cons = ao_scheme_poly_cons(cdr);
-                       first = 0;
-               } else {
+
+               ao_scheme_poly_write(cons->car, write);
+
+               /* keep track of how many pairs have been printed */
+               written++;
+
+               cdr = cons->cdr;
+               if (!AO_SCHEME_IS_CONS(cdr)) {
                        printf(" . ");
-                       ao_scheme_poly_write(cdr);
-                       cons = NULL;
+                       ao_scheme_poly_write(cdr, write);
+                       break;
                }
+               cons = ao_scheme_poly_cons(cdr);
        }
        printf(")");
-}
 
-void
-ao_scheme_cons_display(ao_poly c)
-{
-       struct ao_scheme_cons   *cons = ao_scheme_poly_cons(c);
-       ao_poly                 cdr;
+       if (ao_scheme_print_stop()) {
 
-       while (cons) {
-               ao_scheme_poly_display(cons->car);
-               cdr = cons->cdr;
-               if (cdr == c) {
-                       printf("...");
-                       break;
-               }
-               if (ao_scheme_poly_type(cdr) == AO_SCHEME_CONS)
-                       cons = ao_scheme_poly_cons(cdr);
-               else {
-                       ao_scheme_poly_display(cdr);
-                       cons = NULL;
+               /* If we're still printing, clear the print marks on
+                * all printed pairs
+                */
+               while (written--) {
+                       ao_scheme_print_clear_addr(clear);
+                       clear = ao_scheme_poly_cons(clear->cdr);
                }
        }
 }