From e01c32aac1d05ee5b085de2b560050a7cbef0123 Mon Sep 17 00:00:00 2001 From: Justin Ethier Date: Tue, 15 Aug 2017 17:20:06 +0000 Subject: [PATCH] Differentiate exact/inexact numbers --- read.scm | 8 ++++++-- runtime.c | 5 ++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/read.scm b/read.scm index ea5a2ff6..ec0eac44 100644 --- a/read.scm +++ b/read.scm @@ -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 '()) diff --git a/runtime.c b/runtime.c index e8456805..eada6442 100644 --- a/runtime.c +++ b/runtime.c @@ -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') {