number-parsing repair for no-extflonum builds

This commit is contained in:
Matthew Flatt 2019-02-24 08:03:08 -07:00
parent 47a37f6bbe
commit a3dfc1478a
2 changed files with 265 additions and 149 deletions

View File

@ -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)])]))

View File

@ -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"