From 44c643c7cfae35eb2d10be92befc87f02d814af0 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Sun, 11 Nov 2012 12:26:03 +0900 Subject: [PATCH] Adding support for complex literals in exponential format. --- sexp.c | 27 ++++++++++++++++++++++++--- tests/r7rs-tests.scm | 8 ++++---- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/sexp.c b/sexp.c index 3943c762..56f104f7 100644 --- a/sexp.c +++ b/sexp.c @@ -2320,16 +2320,37 @@ sexp sexp_read_float_tail (sexp ctx, sexp in, double whole, int negp) { for (; c==SEXP_PLACEHOLDER_DIGIT; c=sexp_read_char(ctx, in), scale*=0.1) val += sexp_placeholder_digit_value(10)*scale; #endif + val += whole; + if (negp) val *= -1; if (is_precision_indicator(c)) { c2 = sexp_read_char(ctx, in); if (c2 != '+') sexp_push_char(ctx, c2, in); exponent = sexp_read_number(ctx, in, 10); - if (sexp_exceptionp(exponent)) return exponent; + if (sexp_exceptionp(exponent)) { + sexp_gc_release1(ctx); + return exponent; + } +#if SEXP_USE_COMPLEX + if (sexp_complexp(exponent)) { + res = exponent; + exponent = (sexp_complex_real(res) == SEXP_ZERO ? sexp_complex_imag(res) : sexp_complex_real(res)); + } +#endif e = (sexp_fixnump(exponent) ? sexp_unbox_fixnum(exponent) : sexp_flonump(exponent) ? sexp_flonum_value(exponent) : 0.0); +#if SEXP_USE_COMPLEX + if (sexp_complexp(res)) { + if (sexp_complex_real(res) == SEXP_ZERO) { + sexp_complex_imag(res) = sexp_make_flonum(ctx, val * pow(10, e)); + } else { + sexp_complex_real(res) = sexp_make_flonum(ctx, val * pow(10, e)); + } + sexp_gc_release1(ctx); + return res; + } +#endif } - val = (whole + val) * pow(10, e); - if (negp) val *= -1; + if (e != 0.0) val *= pow(10, e); #if SEXP_USE_FLONUMS res = sexp_make_flonum(ctx, val); #else diff --git a/tests/r7rs-tests.scm b/tests/r7rs-tests.scm index 9ddcad57..bf560f33 100644 --- a/tests/r7rs-tests.scm +++ b/tests/r7rs-tests.scm @@ -1546,10 +1546,10 @@ ;; Decimal-notation complex numbers (rectangular notation) ("1.0+2i" (make-rectangular 1.0 2) "1.0+2.0i" "1.0+2i" "1.+2i" "1.+2.i") ("1+2.0i" (make-rectangular 1 2.0) "1.0+2.0i" "1+2.0i" "1.+2.i" "1+2.i") - ;; ("1e2+1.0i" (make-rectangular 100.0 1.0) "100.0+1.0i" "100.+1.i") - ;; ("1s2+1.0i" (make-rectangular 100.0 1.0) "100.0+1.0i" "100.+1.i") - ;; ("1.0+1e2i" (make-rectangular 1.0 100.0) "1.0+100.0i" "1.+100.i") - ;; ("1.0+1s2i" (make-rectangular 1.0 100.0) "1.0+100.0i" "1.+100.i") + ("1e2+1.0i" (make-rectangular 100.0 1.0) "100.0+1.0i" "100.+1.i") + ("1s2+1.0i" (make-rectangular 100.0 1.0) "100.0+1.0i" "100.+1.i") + ("1.0+1e2i" (make-rectangular 1.0 100.0) "1.0+100.0i" "1.+100.i") + ("1.0+1s2i" (make-rectangular 1.0 100.0) "1.0+100.0i" "1.+100.i") ;; Fractional complex numbers (rectangular notation) ("1/2+3/4i" (make-rectangular (/ 1 2) (/ 3 4))) ;; Mixed fractional/decimal notation complex numbers (rectangular notation)