Differentiate exact/inexact numbers

This commit is contained in:
Justin Ethier 2017-08-15 17:20:06 +00:00
parent ab293fccb9
commit e01c32aac1
2 changed files with 8 additions and 5 deletions

View file

@ -745,9 +745,13 @@
(loop (cons t lis) (parse2 fp))))))
((vector? token)
(cond
((= (vector-length token) 2) ;; Special case, number
((= (vector-length token) 2) ;; Special case: number
(string->number (vector-ref token 0) (vector-ref token 1)))
((= (vector-length token) 1) ;; Special case, number
((= (vector-length token) 3) ;; Special case: exact/inexact number
(if (vector-ref token 2)
(exact (string->number (vector-ref token 0) (vector-ref token 1)))
(inexact (string->number (vector-ref token 0) (vector-ref token 1)))))
((= (vector-length token) 1) ;; Special case: error
(error (vector-ref token 0)))
(else
(let loop ((lis '())

View file

@ -5936,11 +5936,11 @@ void _read_return_number(void *data, port_type *p, int base, int exact)
p->tok_end = 0; // Reset for next atom
make_empty_vector(vec);
make_string(str, p->tok_buf);
vec.num_elements = 2;
vec.num_elements = 3;
vec.elements = (object *) alloca(sizeof(object) * vec.num_elements);
vec.elements[0] = &str;
vec.elements[1] = obj_int2obj(base);
// TODO: need to pass exact or inexact
vec.elements[2] = exact ? boolean_t : boolean_f;
return_thread_runnable(data, &vec);
}
@ -6090,7 +6090,6 @@ void Cyc_io_read_token(void *data, object cont, object port)
}
return_thread_runnable(data, boolean_f);
// TODO: character
// TODO: numbers
} else if (c == 'e') {
_read_number(data, p, 10, 1);
} else if (c == 'i') {