From a3dfc1478a57e1a7338a1d799cd4d98caca64e5a Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Sun, 24 Feb 2019 08:03:08 -0700 Subject: [PATCH] number-parsing repair for no-extflonum builds --- racket/src/expander/read/number.rkt | 44 +++- racket/src/racket/src/startup.inc | 370 +++++++++++++++++----------- 2 files changed, 265 insertions(+), 149 deletions(-) diff --git a/racket/src/expander/read/number.rkt b/racket/src/expander/read/number.rkt index 42c56db051..f8ebbd031f 100644 --- a/racket/src/expander/read/number.rkt +++ b/racket/src/expander/read/number.rkt @@ -54,8 +54,8 @@ #:authentic) ;; `sgn/z` records a sign in case `n` is zero -(struct rect-prefix (sgn/z n) #:authentic) -(struct polar-prefix (sgn/z n) #:authentic) +(struct rect-prefix (sgn/z n start) #:authentic) +(struct polar-prefix (sgn/z n start) #:authentic) ;; Exactness state is one of ;; - 'exact ; found "#e" @@ -243,7 +243,9 @@ ;; The `sgn/z` argument lets us produce -0.0 instead of 0.0 as needed ;; when converting an exact zero to inexact. That is, the sign is `-1` ;; when the input has a literal "-", but it's only used when `n` is 0. -(define (finish sgn/z n s state) +(define (finish sgn/z n s state + ;; Used only when we have to resort to host:string->number: + #:range [range #f]) (define fst (parse-state-fst state)) (cond [(or (not fst) (eq? fst '+/-)) @@ -268,7 +270,10 @@ (lambda (r) (real->extfl r)))] [else - (host:string->number s 10 'read)])] + (define trim-s (trim-number s + (if range (car range) 0) + (if range (cdr range) (string-length s)))) + (host:string->number trim-s 10 'read)])] [(double inexact approx) (maybe (force-lazy-inexact sgn/z n state s) (lambda (r0) @@ -279,8 +284,11 @@ (fail state "cannot convert extflonum to exact in `~a`" s)] [else (force-lazy-exact n state s)])] [(polar-prefix? fst) - (define m (finish (polar-prefix-sgn/z fst) (polar-prefix-n fst) s (state-first-half state))) - (define a (finish sgn/z n s (state-second-half state))) + (define pos (polar-prefix-start fst)) + (define m (finish (polar-prefix-sgn/z fst) (polar-prefix-n fst) s (state-first-half state) + #:range (cons 0 pos))) + (define a (finish sgn/z n s (state-second-half state) + #:range (cons pos (string-length s)))) ;; extflonum errors take precedence over errors like divide-by-zero (cond [(extflonum? m) @@ -318,8 +326,11 @@ (make-rectangular zero i)])))] [(and (rect-prefix? fst) (fx= start end)) - (define r (finish (rect-prefix-sgn/z fst) (rect-prefix-n fst) s (state-first-half state))) - (define i (finish sgn/z n s (state-second-half state))) + (define pos (rect-prefix-start fst)) + (define r (finish (rect-prefix-sgn/z fst) (rect-prefix-n fst) s (state-first-half state) + #:range (cons 0 pos))) + (define i (finish sgn/z n s (state-second-half state) + #:range (cons pos (string-length s)))) ;; extflonum errors take precedence over other errors (such as divide-by-zero) (cond [(extflonum? r) @@ -373,6 +384,17 @@ [(#\t #\T) 'extended]) #:override? override?)) +;; When we have to use `host:string->number` to deal with extflonums, +;; we need to extract the right part of the string. Remove any '#' +;; from the front and any 'i' at the end. +(define (trim-number s start end) + (cond + [(eqv? (string-ref s start) #\#) + (trim-number s (fx+ 2 start) end)] + [(eqv? (string-ref s (fx- end 1)) #\i) + (trim-number s start (fx- end 1))] + [else (substring s start end)])) + ;; ---------------------------------------- ;; The parser is implemented as a kind of state machine that is driven @@ -739,7 +761,7 @@ [else ;; take it from almost the top, pushing the number so far into `state`; ;; we don't have to start at the very top, because we saw a "+" or "-" - (read-signed sgn s start end radix (state-set-first-half state (rect-prefix real-sgn real)))])) + (read-signed sgn s start end radix (state-set-first-half state (rect-prefix real-sgn real (fx- start 1))))])) ;; consumed "@" after the number in `real` (define (read-polar real-sgn real s start end radix state) @@ -755,10 +777,10 @@ [(eof) (bad-misplaced "@" s state)] [(#\+ #\-) - (define new-state (state-set-first-half state (polar-prefix real-sgn real))) + (define new-state (state-set-first-half state (polar-prefix real-sgn real start))) (read-signed (if (eq? c '#\+) 1 -1) s (fx+ 1 start) end radix new-state)] [(digit) - (define new-state (state-set-first-half state (polar-prefix real-sgn real))) + (define new-state (state-set-first-half state (polar-prefix real-sgn real start))) (read-integer 1 c s (fx+ 1 start) end radix new-state)] [else (bad-digit c s state)])])) diff --git a/racket/src/racket/src/startup.inc b/racket/src/racket/src/startup.inc index 6dd0be377b..c5be87a000 100644 --- a/racket/src/racket/src/startup.inc +++ b/racket/src/racket/src/startup.inc @@ -53778,14 +53778,14 @@ static const char *startup_source = "(unchecked-string->number)" "(lambda(s_0 radix_0 convert-mode_0 decimal-mode_0)" "(begin" -"(let-values(((s45_0) s_0)" -"((temp46_0) 0)" -"((temp47_0)(string-length s_0))" -"((radix48_0) radix_0)" -"((temp49_0) #f)" -"((decimal-mode50_0) decimal-mode_0)" -"((convert-mode51_0) convert-mode_0))" -"(do-string->number41.1 temp49_0 s45_0 temp46_0 temp47_0 radix48_0 decimal-mode50_0 convert-mode51_0)))))" +"(let-values(((s54_0) s_0)" +"((temp55_0) 0)" +"((temp56_0)(string-length s_0))" +"((radix57_0) radix_0)" +"((temp58_0) #f)" +"((decimal-mode59_0) decimal-mode_0)" +"((convert-mode60_0) convert-mode_0))" +"(do-string->number50.1 temp58_0 s54_0 temp55_0 temp56_0 radix57_0 decimal-mode59_0 convert-mode60_0)))))" "(define-values" "(struct:parse-state" " parse-state7.1" @@ -53818,20 +53818,20 @@ static const char *startup_source = "(make-struct-field-accessor -ref_0 2 'fst)" "(make-struct-field-accessor -ref_0 3 'other-exactness))))" "(define-values" -"(struct:rect-prefix rect-prefix8.1 rect-prefix? rect-prefix-sgn/z rect-prefix-n)" +"(struct:rect-prefix rect-prefix8.1 rect-prefix? rect-prefix-sgn/z rect-prefix-n rect-prefix-start)" "(let-values(((struct:_0 make-_0 ?_0 -ref_0 -set!_0)" "(let-values()" "(let-values()" "(make-struct-type" " 'rect-prefix" " #f" -" 2" +" 3" " 0" " #f" "(list(cons prop:authentic #t))" "(current-inspector)" " #f" -" '(0 1)" +" '(0 1 2)" " #f" " 'rect-prefix)))))" "(values" @@ -53839,22 +53839,23 @@ static const char *startup_source = " make-_0" " ?_0" "(make-struct-field-accessor -ref_0 0 'sgn/z)" -"(make-struct-field-accessor -ref_0 1 'n))))" +"(make-struct-field-accessor -ref_0 1 'n)" +"(make-struct-field-accessor -ref_0 2 'start))))" "(define-values" -"(struct:polar-prefix polar-prefix9.1 polar-prefix? polar-prefix-sgn/z polar-prefix-n)" +"(struct:polar-prefix polar-prefix9.1 polar-prefix? polar-prefix-sgn/z polar-prefix-n polar-prefix-start)" "(let-values(((struct:_0 make-_0 ?_0 -ref_0 -set!_0)" "(let-values()" "(let-values()" "(make-struct-type" " 'polar-prefix" " #f" -" 2" +" 3" " 0" " #f" "(list(cons prop:authentic #t))" "(current-inspector)" " #f" -" '(0 1)" +" '(0 1 2)" " #f" " 'polar-prefix)))))" "(values" @@ -53862,7 +53863,8 @@ static const char *startup_source = " make-_0" " ?_0" "(make-struct-field-accessor -ref_0 0 'sgn/z)" -"(make-struct-field-accessor -ref_0 1 'n))))" +"(make-struct-field-accessor -ref_0 1 'n)" +"(make-struct-field-accessor -ref_0 2 'start))))" "(define-values" "(init-state)" "(lambda(exactness_0 convert-mode_0 fst_0)(begin(parse-state7.1 exactness_0 convert-mode_0 fst_0 exactness_0))))" @@ -53875,10 +53877,10 @@ static const char *startup_source = "(begin" "(let-values(((the-struct_0) state_0))" "(if(parse-state? the-struct_0)" -"(let-values(((fst55_0) fst_0)" -"((exactness56_0)(parse-state-other-exactness state_0))" -"((other-exactness57_0)(parse-state-exactness state_0)))" -"(parse-state7.1 exactness56_0(parse-state-convert-mode the-struct_0) fst55_0 other-exactness57_0))" +"(let-values(((fst64_0) fst_0)" +"((exactness65_0)(parse-state-other-exactness state_0))" +"((other-exactness66_0)(parse-state-exactness state_0)))" +"(parse-state7.1 exactness65_0(parse-state-convert-mode the-struct_0) fst64_0 other-exactness66_0))" " (raise-argument-error 'struct-copy \"parse-state?\" the-struct_0))))))" "(define-values" "(state-first-half)" @@ -54097,9 +54099,16 @@ static const char *startup_source = "(let-values() #f)))))" "(let-values() #f))))))" "(define-values" -"(finish)" -"(lambda(sgn/z_0 n_0 s_0 state_0)" +"(finish25.1)" +"(lambda(range19_0 sgn/z21_0 n22_0 s23_0 state24_0)" "(begin" +" 'finish25" +"(let-values(((sgn/z_0) sgn/z21_0))" +"(let-values(((n_0) n22_0))" +"(let-values(((s_0) s23_0))" +"(let-values(((state_0) state24_0))" +"(let-values(((range_0) range19_0))" +"(let-values()" "(let-values(((fst_0)(parse-state-fst state_0)))" "(if(let-values(((or-part_0)(not fst_0)))(if or-part_0 or-part_0(eq? fst_0 '+/-)))" "(let-values()" @@ -54116,11 +54125,12 @@ static const char *startup_source = "(if(if(equal? tmp_1 +inf.0) #t(if(equal? tmp_1 -inf.0) #t(equal? tmp_1 +nan.0)))" "(let-values()" "(if(eq?(state->convert-mode state_0) 'must-read)" -" (let-values () (format \"no exact representation for ~a\" n_0))" +" (let-values () (format \"no exact representation for ~a\" n_0))" "(let-values() #f)))" "(let-values()" "(let-values(((v_0)(force-lazy-exact n_0 state_0 s_0)))" -"(if(let-values(((or-part_0)(not v_0)))(if or-part_0 or-part_0(string? v_0)))" +"(if(let-values(((or-part_0)(not v_0)))" +"(if or-part_0 or-part_0(string? v_0)))" " v_0" "((lambda(r_0)(inexact->exact r_0)) v_0)))))))" "(if(equal? tmp_0 'extended)" @@ -54130,11 +54140,20 @@ static const char *startup_source = "(if(extflonum-available?)" "(let-values()" "(let-values(((v_0)(force-lazy-inexact sgn/z_0 n_0 state_0 s_0 32768)))" -"(if(let-values(((or-part_0)(not v_0)))(if or-part_0 or-part_0(string? v_0)))" +"(if(let-values(((or-part_0)(not v_0)))" +"(if or-part_0 or-part_0(string? v_0)))" " v_0" "((lambda(r_0)(real->extfl r_0)) v_0))))" -"(let-values()(string->number$1 s_0 10 'read)))))" -"(if(if(equal? tmp_0 'double) #t(if(equal? tmp_0 'inexact) #t(equal? tmp_0 'approx)))" +"(let-values()" +"(let-values(((trim-s_0)" +"(trim-number" +" s_0" +"(if range_0(car range_0) 0)" +"(if range_0(cdr range_0)(string-length s_0)))))" +"(string->number$1 trim-s_0 10 'read))))))" +"(if(if(equal? tmp_0 'double)" +" #t" +"(if(equal? tmp_0 'inexact) #t(equal? tmp_0 'approx)))" "(let-values()" "(let-values(((v_0)(force-lazy-inexact sgn/z_0 n_0 state_0 s_0)))" "(if(let-values(((or-part_0)(not v_0)))(if or-part_0 or-part_0(string? v_0)))" @@ -54143,30 +54162,44 @@ static const char *startup_source = "(if(equal? tmp_0 'extflonum->inexact)" "(let-values()" "(if(eq?(state->convert-mode state_0) 'must-read)" -" (let-values () (format \"cannot convert extflonum to inexact in `~a`\" s_0))" +" (let-values () (format \"cannot convert extflonum to inexact in `~a`\" s_0))" "(let-values() #f)))" "(if(equal? tmp_0 'extflonum->exact)" "(let-values()" "(if(eq?(state->convert-mode state_0) 'must-read)" -" (let-values () (format \"cannot convert extflonum to exact in `~a`\" s_0))" +" (let-values () (format \"cannot convert extflonum to exact in `~a`\" s_0))" "(let-values() #f)))" "(let-values()(force-lazy-exact n_0 state_0 s_0))))))))))" "(if(polar-prefix? fst_0)" "(let-values()" +"(let-values(((pos_0)(polar-prefix-start fst_0)))" "(let-values(((m_0)" -"(finish(polar-prefix-sgn/z fst_0)(polar-prefix-n fst_0) s_0(state-first-half state_0))))" -"(let-values(((a_0)(finish sgn/z_0 n_0 s_0(state-second-half state_0))))" +"(let-values(((temp69_0)(polar-prefix-sgn/z fst_0))" +"((temp70_0)(polar-prefix-n fst_0))" +"((s71_0) s_0)" +"((temp72_0)(state-first-half state_0))" +"((temp73_0)(cons 0 pos_0)))" +"(finish25.1 temp73_0 temp69_0 temp70_0 s71_0 temp72_0))))" +"(let-values(((a_0)" +"(let-values(((sgn/z74_0) sgn/z_0)" +"((n75_0) n_0)" +"((s76_0) s_0)" +"((temp77_0)(state-second-half state_0))" +"((temp78_0)(cons pos_0(string-length s_0))))" +"(finish25.1 temp78_0 sgn/z74_0 n75_0 s76_0 temp77_0))))" "(if(extflonum? m_0)" "(let-values()(bad-extflonum-for-complex m_0 s_0 state_0))" "(if(extflonum? a_0)" "(let-values()(bad-extflonum-for-complex a_0 s_0 state_0))" "(let-values()" "(let-values(((v_0) m_0))" -"(if(let-values(((or-part_0)(not v_0)))(if or-part_0 or-part_0(string? v_0)))" +"(if(let-values(((or-part_0)(not v_0)))" +"(if or-part_0 or-part_0(string? v_0)))" " v_0" "((lambda(m_1)" "(let-values(((v_1) a_0))" -"(if(let-values(((or-part_0)(not v_1)))(if or-part_0 or-part_0(string? v_1)))" +"(if(let-values(((or-part_0)(not v_1)))" +"(if or-part_0 or-part_0(string? v_1)))" " v_1" "((lambda(a_1)" "(let-values(((cn_0)(make-polar m_1 a_1)))" @@ -54175,13 +54208,13 @@ static const char *startup_source = "(let-values()(inexact->exact cn_0))" "(let-values() cn_0)))))" " v_1))))" -" v_0)))))))))" +" v_0))))))))))" "(if fst_0" "(let-values()" "(if(eq?(state->convert-mode state_0) 'must-read)" -" (let-values () (format \"missing `i` for complex number in `~.a`\" s_0))" +" (let-values () (format \"missing `i` for complex number in `~.a`\" s_0))" "(let-values() #f)))" -"(void))))))))" +"(void))))))))))))))" "(define-values" "(finish-imaginary)" "(lambda(sgn/z_0 n_0 s_0 start_0 end_0 state_0)" @@ -54189,7 +54222,9 @@ static const char *startup_source = "(let-values(((fst_0)(parse-state-fst state_0)))" "(if(if(eq? fst_0 '+/-)(fx= start_0 end_0) #f)" "(let-values()" -"(let-values(((v_0)(finish sgn/z_0 n_0 s_0 state_0)))" +"(let-values(((v_0)" +"(let-values(((sgn/z79_0) sgn/z_0)((n80_0) n_0)((s81_0) s_0)((state82_0) state_0))" +"(finish25.1 #f sgn/z79_0 n80_0 s81_0 state82_0))))" "(if(let-values(((or-part_0)(not v_0)))(if or-part_0 or-part_0(string? v_0)))" " v_0" "((lambda(i_0)" @@ -54203,9 +54238,21 @@ static const char *startup_source = " v_0))))" "(if(if(rect-prefix? fst_0)(fx= start_0 end_0) #f)" "(let-values()" +"(let-values(((pos_0)(rect-prefix-start fst_0)))" "(let-values(((r_0)" -"(finish(rect-prefix-sgn/z fst_0)(rect-prefix-n fst_0) s_0(state-first-half state_0))))" -"(let-values(((i_0)(finish sgn/z_0 n_0 s_0(state-second-half state_0))))" +"(let-values(((temp83_0)(rect-prefix-sgn/z fst_0))" +"((temp84_0)(rect-prefix-n fst_0))" +"((s85_0) s_0)" +"((temp86_0)(state-first-half state_0))" +"((temp87_0)(cons 0 pos_0)))" +"(finish25.1 temp87_0 temp83_0 temp84_0 s85_0 temp86_0))))" +"(let-values(((i_0)" +"(let-values(((sgn/z88_0) sgn/z_0)" +"((n89_0) n_0)" +"((s90_0) s_0)" +"((temp91_0)(state-second-half state_0))" +"((temp92_0)(cons pos_0(string-length s_0))))" +"(finish25.1 temp92_0 sgn/z88_0 n89_0 s90_0 temp91_0))))" "(if(extflonum? r_0)" "(let-values()(bad-extflonum-for-complex r_0 s_0 state_0))" "(if(extflonum? i_0)" @@ -54219,16 +54266,16 @@ static const char *startup_source = "(if(let-values(((or-part_0)(not v_1)))(if or-part_0 or-part_0(string? v_1)))" " v_1" "((lambda(i_1)(make-rectangular r_1 i_1)) v_1))))" -" v_0)))))))))" +" v_0))))))))))" " (let-values () (bad-misplaced \"i\" s_0 state_0))))))))" "(define-values" -"(set-exactness23.1)" -"(lambda(override?19_0 state21_0 new-exactness22_0)" +"(set-exactness32.1)" +"(lambda(override?28_0 state30_0 new-exactness31_0)" "(begin" -" 'set-exactness23" -"(let-values(((state_0) state21_0))" -"(let-values(((new-exactness_0) new-exactness22_0))" -"(let-values(((override?_0) override?19_0))" +" 'set-exactness32" +"(let-values(((state_0) state30_0))" +"(let-values(((new-exactness_0) new-exactness31_0))" +"(let-values(((override?_0) override?28_0))" "(let-values()" "(let-values(((exactness_0)(parse-state-exactness state_0)))" "(let-values(((result-exactness_0)" @@ -54262,24 +54309,24 @@ static const char *startup_source = " state_0" "(let-values(((the-struct_0) state_0))" "(if(parse-state? the-struct_0)" -"(let-values(((exactness60_0) result-exactness_0))" +"(let-values(((exactness93_0) result-exactness_0))" "(parse-state7.1" -" exactness60_0" +" exactness93_0" "(parse-state-convert-mode the-struct_0)" "(parse-state-fst the-struct_0)" "(parse-state-other-exactness the-struct_0)))" " (raise-argument-error 'struct-copy \"parse-state?\" the-struct_0)))))))))))))" "(define-values" -"(set-exactness-by-char30.1)" -"(lambda(override?26_0 state28_0 c29_0)" +"(set-exactness-by-char39.1)" +"(lambda(override?35_0 state37_0 c38_0)" "(begin" -" 'set-exactness-by-char30" -"(let-values(((state_0) state28_0))" -"(let-values(((c_0) c29_0))" -"(let-values(((override?_0) override?26_0))" +" 'set-exactness-by-char39" +"(let-values(((state_0) state37_0))" +"(let-values(((c_0) c38_0))" +"(let-values(((override?_0) override?35_0))" "(let-values()" -"(let-values(((state61_0) state_0)" -"((temp62_0)" +"(let-values(((state94_0) state_0)" +"((temp95_0)" "(let-values(((tmp_0) c_0))" "(let-values(((index_0)" "(if(char? tmp_0)" @@ -54363,20 +54410,29 @@ static const char *startup_source = "(if(unsafe-fx< index_0 2)" "(let-values() 'double)" "(if(unsafe-fx< index_0 3)(let-values() 'single)(let-values() 'extended)))))))" -"((override?63_0) override?_0))" -"(set-exactness23.1 override?63_0 state61_0 temp62_0)))))))))" +"((override?96_0) override?_0))" +"(set-exactness32.1 override?96_0 state94_0 temp95_0)))))))))" "(define-values" -"(do-string->number41.1)" -"(lambda(radix-set?33_0 s35_0 start36_0 end37_0 radix38_0 exactness39_0 convert-mode40_0)" +"(trim-number)" +"(lambda(s_0 start_0 end_0)" "(begin" -" 'do-string->number41" -"(let-values(((s_0) s35_0))" -"(let-values(((start_0) start36_0))" -"(let-values(((end_0) end37_0))" -"(let-values(((radix_0) radix38_0))" -"(let-values(((radix-set?_0) radix-set?33_0))" -"(let-values(((exactness_0) exactness39_0))" -"(let-values(((convert-mode_0) convert-mode40_0))" +"(if(eqv?(string-ref s_0 start_0) '#\\#)" +"(let-values()(trim-number s_0(fx+ 2 start_0) end_0))" +"(if(eqv?(string-ref s_0(fx- end_0 1)) '#\\i)" +"(let-values()(trim-number s_0 start_0(fx- end_0 1)))" +"(let-values()(substring s_0 start_0 end_0)))))))" +"(define-values" +"(do-string->number50.1)" +"(lambda(radix-set?42_0 s44_0 start45_0 end46_0 radix47_0 exactness48_0 convert-mode49_0)" +"(begin" +" 'do-string->number50" +"(let-values(((s_0) s44_0))" +"(let-values(((start_0) start45_0))" +"(let-values(((end_0) end46_0))" +"(let-values(((radix_0) radix47_0))" +"(let-values(((radix-set?_0) radix-set?42_0))" +"(let-values(((exactness_0) exactness48_0))" +"(let-values(((convert-mode_0) convert-mode49_0))" "(let-values()" "(let-values(((c_0)" "(if(fx= start_0 end_0)" @@ -54432,26 +54488,26 @@ static const char *startup_source = "(substring s_0 start_0 end_0)))" "(let-values() #f)))" "(let-values()" -"(let-values(((s64_0) s_0)" -"((temp65_0)(fx+ 1 next_0))" -"((end66_0) end_0)" -"((radix67_0) radix_0)" -"((radix-set?68_0) radix-set?_0)" -"((temp69_0)" +"(let-values(((s97_0) s_0)" +"((temp98_0)(fx+ 1 next_0))" +"((end99_0) end_0)" +"((radix100_0) radix_0)" +"((radix-set?101_0) radix-set?_0)" +"((temp102_0)" "(if(let-values(((or-part_0)(char=? i_0 '#\\e)))" "(if or-part_0 or-part_0(char=? i_0 '#\\E)))" " 'exact" " 'inexact))" -"((temp70_0)" +"((temp103_0)" "(if(eq? convert-mode_0 'read) 'must-read convert-mode_0)))" -"(do-string->number41.1" -" radix-set?68_0" -" s64_0" -" temp65_0" -" end66_0" -" radix67_0" -" temp69_0" -" temp70_0)))))" +"(do-string->number50.1" +" radix-set?101_0" +" s97_0" +" temp98_0" +" end99_0" +" radix100_0" +" temp102_0" +" temp103_0)))))" "(if(let-values(((or-part_0)(eqv? i_0 '#\\b)))" "(if or-part_0" " or-part_0" @@ -54494,24 +54550,24 @@ static const char *startup_source = "(if(if(equal? tmp_0 '#\\d) #t(equal? tmp_0 '#\\D))" "(let-values() 10)" "(let-values() 16)))))))" -"(let-values(((s71_0) s_0)" -"((temp72_0)(fx+ 1 next_0))" -"((end73_0) end_0)" -"((radix74_0) radix_1)" -"((temp75_0) #t)" -"((exactness76_0) exactness_0)" -"((temp77_0)" +"(let-values(((s104_0) s_0)" +"((temp105_0)(fx+ 1 next_0))" +"((end106_0) end_0)" +"((radix107_0) radix_1)" +"((temp108_0) #t)" +"((exactness109_0) exactness_0)" +"((temp110_0)" "(if(eq? convert-mode_0 'read)" " 'must-read" " convert-mode_0)))" -"(do-string->number41.1" -" temp75_0" -" s71_0" -" temp72_0" -" end73_0" -" radix74_0" -" exactness76_0" -" temp77_0))))))" +"(do-string->number50.1" +" temp108_0" +" s104_0" +" temp105_0" +" end106_0" +" radix107_0" +" exactness109_0" +" temp110_0))))))" "(let-values()" "(if(eq?" "(state->convert-mode" @@ -54551,9 +54607,9 @@ static const char *startup_source = "(fx+ 1 start_0)" " end_0" " radix_0" -"(let-values(((temp78_0)(init-state exactness_0 convert-mode_0 #f))" -"((temp79_0) 'approx))" -"(set-exactness23.1 #f temp78_0 temp79_0))))" +"(let-values(((temp111_0)(init-state exactness_0 convert-mode_0 #f))" +"((temp112_0) 'approx))" +"(set-exactness32.1 #f temp111_0 temp112_0))))" "(let-values()(bad-digit c_0 s_0 convert-mode_0))))))))))))))))))))" "(define-values" "(read-signed)" @@ -54580,7 +54636,8 @@ static const char *startup_source = "(fx+ 1 start_0)" " end_0" " radix_0" -"(let-values(((state80_0) state_0)((temp81_0) 'approx))(set-exactness23.1 #f state80_0 temp81_0))))" +"(let-values(((state113_0) state_0)((temp114_0) 'approx))" +"(set-exactness32.1 #f state113_0 temp114_0))))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\i)))" "(if or-part_0 or-part_0(let-values(((or-part_1)(eqv? c_0 '#\\I)))(if or-part_1 or-part_1 #f))))" "(let-values()" @@ -54610,7 +54667,9 @@ static const char *startup_source = " 'eof" "(let-values(((c_0)(string-ref s_0 start_0)))(maybe-digit c_0 radix_0)))))" "(if(let-values(((or-part_0)(eqv? c_0 'eof)))(if or-part_0 or-part_0 #f))" -"(let-values()(finish sgn_0(get-n_0) s_0 state_0))" +"(let-values()" +"(let-values(((sgn115_0) sgn_0)((temp116_0)(get-n_0))((s117_0) s_0)((state118_0) state_0))" +"(finish25.1 #f sgn115_0 temp116_0 s117_0 state118_0)))" "(if(let-values(((or-part_0)(fixnum? c_0)))(if or-part_0 or-part_0 #f))" "(let-values()(read-integer sgn_0(+(* n_0 radix_0) c_0) s_0(fx+ 1 start_0) end_0 radix_0 state_0))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\.)))(if or-part_0 or-part_0 #f))" @@ -54623,7 +54682,8 @@ static const char *startup_source = "(fx+ 1 start_0)" " end_0" " radix_0" -"(let-values(((state82_0) state_0)((temp83_0) 'approx))(set-exactness23.1 #f state82_0 temp83_0))))" +"(let-values(((state119_0) state_0)((temp120_0) 'approx))" +"(set-exactness32.1 #f state119_0 temp120_0))))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\e)))" "(if or-part_0" " or-part_0" @@ -54668,7 +54728,8 @@ static const char *startup_source = "(fx+ 1 start_0)" " end_0" " radix_0" -"(let-values(((state84_0) state_0)((c85_0) c_0))(set-exactness-by-char30.1 #f state84_0 c85_0))))" +"(let-values(((state121_0) state_0)((c122_0) c_0))" +"(set-exactness-by-char39.1 #f state121_0 c122_0))))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\/)))(if or-part_0 or-part_0 #f))" "(let-values()(read-rational sgn_0(get-n_0) #f s_0(fx+ 1 start_0) end_0 radix_0 state_0))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\#)))(if or-part_0 or-part_0 #f))" @@ -54682,8 +54743,8 @@ static const char *startup_source = "(fx+ 1 start_0)" " end_0" " radix_0" -"(let-values(((state86_0) state_0)((temp87_0) 'approx))" -"(set-exactness23.1 #f state86_0 temp87_0))))" +"(let-values(((state123_0) state_0)((temp124_0) 'approx))" +"(set-exactness32.1 #f state123_0 temp124_0))))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\+)))" "(if or-part_0" " or-part_0" @@ -54725,7 +54786,10 @@ static const char *startup_source = "(let-values(((v_0)(get-n_0)))" "(if(let-values(((or-part_1)(not v_0)))(if or-part_1 or-part_1(string? v_0)))" " v_0" -"((lambda(n_1)(finish sgn_0 n_1 s_0 state_0)) v_0))))))" +"((lambda(n_1)" +"(let-values(((sgn125_0) sgn_0)((n126_0) n_1)((s127_0) s_0)((state128_0) state_0))" +"(finish25.1 #f sgn125_0 n126_0 s127_0 state128_0)))" +" v_0))))))" "(if(let-values(((or-part_0)(fixnum? c_0)))(if or-part_0 or-part_0 #f))" "(let-values()" "(let-values(((next_0)(fx+ 1 start_0)))" @@ -54797,8 +54861,8 @@ static const char *startup_source = "(fx+ 1 start_0)" " end_0" " radix_0" -"(let-values(((state88_0) state_0)((c89_0) c_0))" -"(set-exactness-by-char30.1 #f state88_0 c89_0)))" +"(let-values(((state129_0) state_0)((c130_0) c_0))" +"(set-exactness-by-char39.1 #f state129_0 c130_0)))" " (bad-no-digits \".\" s_0 state_0)))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\/)))(if or-part_0 or-part_0 #f))" "(let-values()(bad-mixed-decimal-fraction s_0 state_0))" @@ -54847,7 +54911,9 @@ static const char *startup_source = " 'eof" "(let-values(((c_0)(string-ref s_0 start_0)))(maybe-digit c_0 radix_0)))))" "(if(let-values(((or-part_0)(eqv? c_0 'eof)))(if or-part_0 or-part_0 #f))" -"(let-values()(finish sgn_0(get-n_0) s_0 state_0))" +"(let-values()" +"(let-values(((sgn131_0) sgn_0)((temp132_0)(get-n_0))((s133_0) s_0)((state134_0) state_0))" +"(finish25.1 #f sgn131_0 temp132_0 s133_0 state134_0)))" "(if(let-values(((or-part_0)(fixnum? c_0)))(if or-part_0 or-part_0 #f))" " (let-values () (bad-misplaced \"#\" s_0 state_0))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\.)))(if or-part_0 or-part_0 #f))" @@ -54911,8 +54977,8 @@ static const char *startup_source = "(fx+ 1 start_0)" " end_0" " radix_0" -"(let-values(((state90_0) state_0)((c91_0) c_0))" -"(set-exactness-by-char30.1 #f state90_0 c91_0))))" +"(let-values(((state135_0) state_0)((c136_0) c_0))" +"(set-exactness-by-char39.1 #f state135_0 c136_0))))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\/)))(if or-part_0 or-part_0 #f))" "(let-values()" "(if saw-.?_0" @@ -55044,7 +55110,10 @@ static const char *startup_source = "(let-values(((v_0)(get-n_0)))" "(if(let-values(((or-part_1)(not v_0)))(if or-part_1 or-part_1(string? v_0)))" " v_0" -"((lambda(n_0)(finish sgn_0 n_0 s_0 state_0)) v_0))))))" +"((lambda(n_0)" +"(let-values(((sgn137_0) sgn_0)((n138_0) n_0)((s139_0) s_0)((state140_0) state_0))" +"(finish25.1 #f sgn137_0 n138_0 s139_0 state140_0)))" +" v_0))))))" "(if(let-values(((or-part_0)(fixnum? c_0)))(if or-part_0 or-part_0 #f))" "(let-values()" "(let-values(((new-exp2_0)(+(if exp2_0(* exp2_0 radix_0) 0) c_0)))" @@ -55153,10 +55222,13 @@ static const char *startup_source = "(let-values()" "(let-values(((n_0)(if(negative? sgn_0) -inf.0 +inf.0)))" "(let-values(((new-state_0)" -"(let-values(((state92_0) state_0)" -"((temp93_0)(string-ref s_0(fx+ start_0 2)))" -"((temp94_0) #t))" -"(set-exactness-by-char30.1 temp94_0 state92_0 temp93_0))))" +"(let-values(((state141_0) state_0)" +"((temp142_0)(string-ref s_0(fx+ start_0 2)))" +"((temp143_0) #t))" +"(set-exactness-by-char39.1" +" temp143_0" +" state141_0" +" temp142_0))))" "(let-values(((c2_0)" "(if(fx=(fx+ 3 start_0) end_0)" " 'eof" @@ -55164,7 +55236,12 @@ static const char *startup_source = "(maybe-digit c_1 radix_0)))))" "(if(let-values(((or-part_0)(eqv? c2_0 'eof)))" "(if or-part_0 or-part_0 #f))" -"(let-values()(finish sgn_0 n_0 s_0 new-state_0))" +"(let-values()" +"(let-values(((sgn144_0) sgn_0)" +"((n145_0) n_0)" +"((s146_0) s_0)" +"((new-state147_0) new-state_0))" +"(finish25.1 #f sgn144_0 n145_0 s146_0 new-state147_0)))" "(if(let-values(((or-part_0)(eqv? c2_0 '#\\+)))" "(if or-part_0" " or-part_0" @@ -55240,14 +55317,14 @@ static const char *startup_source = "(let-values()" "(let-values(((n_0) +nan.0))" "(let-values(((new-state_0)" -"(let-values(((state95_0) state_0)" -"((temp96_0)" +"(let-values(((state148_0) state_0)" +"((temp149_0)" "(string-ref s_0(fx+ start_0 3)))" -"((temp97_0) #t))" -"(set-exactness-by-char30.1" -" temp97_0" -" state95_0" -" temp96_0))))" +"((temp150_0) #t))" +"(set-exactness-by-char39.1" +" temp150_0" +" state148_0" +" temp149_0))))" "(let-values(((c2_0)" "(if(fx=(fx+ 4 start_0) end_0)" " 'eof" @@ -55258,7 +55335,17 @@ static const char *startup_source = "(maybe-digit c_1 radix_0)))))" "(if(let-values(((or-part_0)(eqv? c2_0 'eof)))" "(if or-part_0 or-part_0 #f))" -"(let-values()(finish 1 n_0 s_0 new-state_0))" +"(let-values()" +"(let-values(((temp151_0) 1)" +"((n152_0) n_0)" +"((s153_0) s_0)" +"((new-state154_0) new-state_0))" +"(finish25.1" +" #f" +" temp151_0" +" n152_0" +" s153_0" +" new-state154_0)))" "(if(let-values(((or-part_0)(eqv? c2_0 '#\\+)))" "(if or-part_0" " or-part_0" @@ -55318,7 +55405,10 @@ static const char *startup_source = "(let-values(((v_0)(get-n_0)))" "(if(let-values(((or-part_0)(not v_0)))(if or-part_0 or-part_0(string? v_0)))" " v_0" -"((lambda(n_0)(finish sgn_0 n_0 s_0 state_0)) v_0))))" +"((lambda(n_0)" +"(let-values(((sgn155_0) sgn_0)((n156_0) n_0)((s157_0) s_0)((state158_0) state_0))" +"(finish25.1 #f sgn155_0 n156_0 s157_0 state158_0)))" +" v_0))))" "(if(let-values(((or-part_0)(fixnum? c_0)))(if or-part_0 or-part_0 #f))" "(let-values()" "(read-rational" @@ -55344,8 +55434,8 @@ static const char *startup_source = "(fx+ 1 start_0)" " end_0" " radix_0" -"(let-values(((state98_0) state_0)((temp99_0) 'approx))" -"(set-exactness23.1 #f state98_0 temp99_0)))" +"(let-values(((state159_0) state_0)((temp160_0) 'approx))" +"(set-exactness32.1 #f state159_0 temp160_0)))" " (bad-misplaced \"#\" s_0 state_0)))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\e)))" "(if or-part_0" @@ -55395,8 +55485,8 @@ static const char *startup_source = "(fx+ 1 start_0)" " end_0" " radix_0" -"(let-values(((state100_0) state_0)((c101_0) c_0))" -"(set-exactness-by-char30.1 #f state100_0 c101_0))))" +"(let-values(((state161_0) state_0)((c162_0) c_0))" +"(set-exactness-by-char39.1 #f state161_0 c162_0))))" " v_0))))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\/)))(if or-part_0 or-part_0 #f))" " (let-values () (bad-misplaced \"/\" s_0 state_0))" @@ -55443,7 +55533,9 @@ static const char *startup_source = " 'eof" "(let-values(((c_0)(string-ref s_0 start_0)))(maybe-digit c_0 radix_0)))))" "(if(let-values(((or-part_0)(eqv? c_0 'eof)))(if or-part_0 or-part_0 #f))" -"(let-values()(finish sgn_0(get-n_0) s_0 state_0))" +"(let-values()" +"(let-values(((sgn163_0) sgn_0)((temp164_0)(get-n_0))((s165_0) s_0)((state166_0) state_0))" +"(finish25.1 #f sgn163_0 temp164_0 s165_0 state166_0)))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\#)))(if or-part_0 or-part_0 #f))" "(let-values()" "(read-denom-approx sgn_0 sgn-n_0 d_0(fx+ 1 exp_0) s_0(fx+ 1 start_0) end_0 radix_0 state_0))" @@ -55496,8 +55588,8 @@ static const char *startup_source = "(fx+ 1 start_0)" " end_0" " radix_0" -"(let-values(((state102_0) state_0)((c103_0) c_0))" -"(set-exactness-by-char30.1 #f state102_0 c103_0))))" +"(let-values(((state167_0) state_0)((c168_0) c_0))" +"(set-exactness-by-char39.1 #f state167_0 c168_0))))" "(if(let-values(((or-part_0)(eqv? c_0 '#\\+)))" "(if or-part_0" " or-part_0" @@ -55532,7 +55624,7 @@ static const char *startup_source = " start_0" " end_0" " radix_0" -"(state-set-first-half state_0(rect-prefix8.1 real-sgn_0 real_0))))))))" +"(state-set-first-half state_0(rect-prefix8.1 real-sgn_0 real_0(fx- start_0 1)))))))))" "(define-values" "(read-polar)" "(lambda(real-sgn_0 real_0 s_0 start_0 end_0 radix_0 state_0)" @@ -55550,11 +55642,13 @@ static const char *startup_source = "(if(let-values(((or-part_0)(eqv? c_0 '#\\+)))" "(if or-part_0 or-part_0(let-values(((or-part_1)(eqv? c_0 '#\\-)))(if or-part_1 or-part_1 #f))))" "(let-values()" -"(let-values(((new-state_0)(state-set-first-half state_0(polar-prefix9.1 real-sgn_0 real_0))))" +"(let-values(((new-state_0)" +"(state-set-first-half state_0(polar-prefix9.1 real-sgn_0 real_0 start_0))))" "(read-signed(if(eq? c_0 '#\\+) 1 -1) s_0(fx+ 1 start_0) end_0 radix_0 new-state_0)))" "(if(let-values(((or-part_0)(fixnum? c_0)))(if or-part_0 or-part_0 #f))" "(let-values()" -"(let-values(((new-state_0)(state-set-first-half state_0(polar-prefix9.1 real-sgn_0 real_0))))" +"(let-values(((new-state_0)" +"(state-set-first-half state_0(polar-prefix9.1 real-sgn_0 real_0 start_0))))" "(read-integer 1 c_0 s_0(fx+ 1 start_0) end_0 radix_0 new-state_0)))" "(let-values()(bad-digit c_0 s_0 state_0)))))))))))" "(define-values"