diff --git a/lib/srfi/38.scm b/lib/srfi/38.scm index 5ed12de3..d75a3006 100644 --- a/lib/srfi/38.scm +++ b/lib/srfi/38.scm @@ -328,7 +328,7 @@ ((#\o) (read-char in) (read-number 8)) ((#\b) (read-char in) (read-number 2)) ((#\i) (read-char in) (exact->inexact (read-one))) - ((#\e) (read-char in) (inexact->exact (read-one))) + ((#\e) (string->number (read-name #\# in))) ((#\u #\v) (if (eqv? #\v (peek-char in)) (read-char in)) diff --git a/sexp.c b/sexp.c index 6f2bb6b9..a2c093be 100644 --- a/sexp.c +++ b/sexp.c @@ -2614,6 +2614,15 @@ sexp sexp_read_number (sexp ctx, sexp in, int base, int exactp) { sexp_gc_var2(res, den); c = sexp_read_char(ctx, in); + if (c == '#') { + switch ((c = sexp_tolower(sexp_read_char(ctx, in)))) { + case 'b': base = 2; break; case 'o': base = 8; break; + case 'd': base = 10; break; case 'x': base = 16; break; + case 'i': exactp = 0; break; case 'e': exactp = 1; break; + default: return sexp_read_error(ctx, "unexpected numeric # code", sexp_make_character(c), in); + } + c = sexp_read_char(ctx, in); + } if (c == '-') { negativep = 1; c = sexp_read_char(ctx, in); diff --git a/tests/srfi-38-tests.scm b/tests/srfi-38-tests.scm index cf5cee34..da0fe7b5 100644 --- a/tests/srfi-38-tests.scm +++ b/tests/srfi-38-tests.scm @@ -77,6 +77,11 @@ (test 99 (read-from-string "#d99")) (test 63 (read-from-string "#o77")) (test 3 (read-from-string "#b11")) +(test 5 (read-from-string "#e5.0")) +(test 5.0 (read-from-string "#i5")) +(test 15 (read-from-string "#e#xf")) +(test 15.0 (read-from-string "#i#xf")) +(test (expt 10 100) (read-from-string "#e1e100")) (cond-expand (chicken