X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fscheme%2Fao_scheme_vector.c;h=083823f3097a1a6318ce267c9bf7dc82b8aa0e08;hb=e030fba5ab556c88af918d08e1b62e63d6605638;hp=0114c5a925fa056228337138672551a16313bca2;hpb=a15166c435f65cb36f487ec8e5a4ff558a7e0502;p=fw%2Faltos diff --git a/src/scheme/ao_scheme_vector.c b/src/scheme/ao_scheme_vector.c index 0114c5a9..083823f3 100644 --- a/src/scheme/ao_scheme_vector.c +++ b/src/scheme/ao_scheme_vector.c @@ -73,48 +73,41 @@ ao_scheme_vector_alloc(uint16_t length, ao_poly fill) } void -ao_scheme_vector_write(ao_poly v) +ao_scheme_vector_write(ao_poly v, bool write) { struct ao_scheme_vector *vector = ao_scheme_poly_vector(v); unsigned int i; - - printf("#("); - for (i = 0; i < vector->length; i++) { - if (i != 0) - printf(" "); - if (vector->vals[i] == v) - printf ("..."); - else - ao_scheme_poly_write(vector->vals[i]); - } - printf(")"); -} - -void -ao_scheme_vector_display(ao_poly v) -{ - struct ao_scheme_vector *vector = ao_scheme_poly_vector(v); - unsigned int i; - - for (i = 0; i < vector->length; i++) { - if (vector->vals[i] == v) - printf("..."); - else - ao_scheme_poly_display(vector->vals[i]); + int was_marked = 0; + + ao_scheme_print_start(); + was_marked = ao_scheme_print_mark_addr(vector); + if (was_marked) { + printf ("..."); + } else { + printf("#("); + for (i = 0; i < vector->length; i++) { + if (i != 0) + printf(" "); + ao_scheme_poly_write(vector->vals[i], write); + } + printf(")"); } + if (ao_scheme_print_stop() && !was_marked) + ao_scheme_print_clear_addr(vector); } static int32_t ao_scheme_vector_offset(struct ao_scheme_vector *vector, ao_poly i) { - int32_t offset = ao_scheme_poly_integer(i); + bool fail; + int32_t offset = ao_scheme_poly_integer(i, &fail); - if (offset == AO_SCHEME_NOT_INTEGER) + if (fail) ao_scheme_error(AO_SCHEME_INVALID, "vector index %v not integer", i); if (offset < 0 || vector->length <= offset) { ao_scheme_error(AO_SCHEME_INVALID, "vector index %v out of range (max %d)", i, vector->length); - offset = AO_SCHEME_NOT_INTEGER; + offset = -1; } return offset; } @@ -125,7 +118,7 @@ ao_scheme_vector_get(ao_poly v, ao_poly i) struct ao_scheme_vector *vector = ao_scheme_poly_vector(v); int32_t offset = ao_scheme_vector_offset(vector, i); - if (offset == AO_SCHEME_NOT_INTEGER) + if (offset < 0) return AO_SCHEME_NIL; return vector->vals[offset]; } @@ -136,7 +129,7 @@ ao_scheme_vector_set(ao_poly v, ao_poly i, ao_poly p) struct ao_scheme_vector *vector = ao_scheme_poly_vector(v); int32_t offset = ao_scheme_vector_offset(vector, i); - if (offset == AO_SCHEME_NOT_INTEGER) + if (offset < 0) return AO_SCHEME_NIL; return vector->vals[offset] = p; } @@ -152,9 +145,9 @@ ao_scheme_list_to_vector(struct ao_scheme_cons *cons) if (ao_scheme_exception) return NULL; - ao_scheme_cons_stash(0, cons); + ao_scheme_cons_stash(cons); vector = ao_scheme_vector_alloc(length, AO_SCHEME_NIL); - cons = ao_scheme_cons_fetch(0); + cons = ao_scheme_cons_fetch(); if (!vector) return NULL; i = 0; @@ -166,16 +159,22 @@ ao_scheme_list_to_vector(struct ao_scheme_cons *cons) } struct ao_scheme_cons * -ao_scheme_vector_to_list(struct ao_scheme_vector *vector) +ao_scheme_vector_to_list(struct ao_scheme_vector *vector, int start, int end) { - unsigned int i; + int i; uint16_t length = vector->length; struct ao_scheme_cons *cons = NULL; - for (i = length; i-- > 0;) { - ao_scheme_poly_stash(2, ao_scheme_vector_poly(vector)); + if (end == -1) + end = length; + if (start < 0) + start = 0; + if (end > length) + end = length; + for (i = end; i-- > start;) { + ao_scheme_vector_stash(vector); cons = ao_scheme_cons_cons(vector->vals[i], ao_scheme_cons_poly(cons)); - vector = ao_scheme_poly_vector(ao_scheme_poly_fetch(2)); + vector = ao_scheme_vector_fetch(); if (!cons) return NULL; }