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)))))) (loop (cons t lis) (parse2 fp))))))
((vector? token) ((vector? token)
(cond (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))) (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))) (error (vector-ref token 0)))
(else (else
(let loop ((lis '()) (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 p->tok_end = 0; // Reset for next atom
make_empty_vector(vec); make_empty_vector(vec);
make_string(str, p->tok_buf); 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 = (object *) alloca(sizeof(object) * vec.num_elements);
vec.elements[0] = &str; vec.elements[0] = &str;
vec.elements[1] = obj_int2obj(base); 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); 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); return_thread_runnable(data, boolean_f);
// TODO: character // TODO: character
// TODO: numbers
} else if (c == 'e') { } else if (c == 'e') {
_read_number(data, p, 10, 1); _read_number(data, p, 10, 1);
} else if (c == 'i') { } else if (c == 'i') {