summaryrefslogtreecommitdiff
path: root/src/scheme/ao_scheme_read.c
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2017-12-10 00:02:00 -0800
committerKeith Packard <keithp@keithp.com>2017-12-10 00:02:00 -0800
commit17fe6de833cccb6d43d0ac0ed84a4faaa3463a09 (patch)
treec51ea265efd63b11473eaae7c816ce067b98df99 /src/scheme/ao_scheme_read.c
parent0d3365e2c04793cd8432c30a66881f53385a2e60 (diff)
altos/scheme: Add vectors
Constant time and smaller can be a feature. Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'src/scheme/ao_scheme_read.c')
-rw-r--r--src/scheme/ao_scheme_read.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/scheme/ao_scheme_read.c b/src/scheme/ao_scheme_read.c
index 30e29441..9ed54b9f 100644
--- a/src/scheme/ao_scheme_read.c
+++ b/src/scheme/ao_scheme_read.c
@@ -340,6 +340,8 @@ _lex(void)
add_token(c);
end_token();
return BOOL;
+ case '(':
+ return OPEN_VECTOR;
case '\\':
for (;;) {
int alphabetic;
@@ -474,10 +476,12 @@ int ao_scheme_read_list;
struct ao_scheme_cons *ao_scheme_read_cons;
struct ao_scheme_cons *ao_scheme_read_cons_tail;
struct ao_scheme_cons *ao_scheme_read_stack;
+static int ao_scheme_read_state;
#define READ_IN_QUOTE 0x01
#define READ_SAW_DOT 0x02
#define READ_DONE_DOT 0x04
+#define READ_SAW_VECTOR 0x08
static int
push_read_stack(int read_state)
@@ -490,7 +494,8 @@ push_read_stack(int read_state)
ao_scheme_cons_poly(ao_scheme_read_stack)));
if (!ao_scheme_read_stack)
return 0;
- }
+ } else
+ ao_scheme_read_state = read_state;
ao_scheme_read_cons = NULL;
ao_scheme_read_cons_tail = NULL;
return 1;
@@ -513,6 +518,7 @@ pop_read_stack(void)
ao_scheme_read_cons = 0;
ao_scheme_read_cons_tail = 0;
ao_scheme_read_stack = 0;
+ read_state = ao_scheme_read_state;
}
RDBG_OUT();
RDBGI("pop read stack %p %d\n", ao_scheme_read_cons, read_state);
@@ -532,7 +538,9 @@ ao_scheme_read(void)
ao_scheme_read_cons = ao_scheme_read_cons_tail = ao_scheme_read_stack = 0;
for (;;) {
parse_token = lex();
- while (parse_token == OPEN) {
+ while (parse_token == OPEN || parse_token == OPEN_VECTOR) {
+ if (parse_token == OPEN_VECTOR)
+ read_state |= READ_SAW_VECTOR;
if (!push_read_stack(read_state))
return AO_SCHEME_NIL;
ao_scheme_read_list++;
@@ -604,6 +612,8 @@ ao_scheme_read(void)
v = ao_scheme_cons_poly(ao_scheme_read_cons);
--ao_scheme_read_list;
read_state = pop_read_stack();
+ if (read_state & READ_SAW_VECTOR)
+ v = ao_scheme_vector_poly(ao_scheme_list_to_vector(ao_scheme_poly_cons(v)));
break;
case DOT:
if (!ao_scheme_read_list) {