some refactoring of string-to-number parsers
This commit is contained in:
		
							parent
							
								
									4df1dcb25a
								
							
						
					
					
						commit
						b2bca8a00a
					
				|  | @ -260,7 +260,7 @@ | ||||||
|                   (string-append ".." (string c)))]))] |                   (string-append ".." (string c)))]))] | ||||||
|           [else  |           [else  | ||||||
|            (cons 'datum |            (cons 'datum | ||||||
|              (dot p '(#\.) 10 #f +1))])))) |              (u:dot p '(#\.) 10 #f #f +1))])))) | ||||||
|   (define tokenize-char*  |   (define tokenize-char*  | ||||||
|     (lambda (i str p d) |     (lambda (i str p d) | ||||||
|       (cond |       (cond | ||||||
|  | @ -633,7 +633,7 @@ | ||||||
|                char-case)))])) |                char-case)))])) | ||||||
| 
 | 
 | ||||||
|   (define-string->number-parser port-config |   (define-string->number-parser port-config | ||||||
|     (parse-string digit+ sign dot)) |     (parse-string u:digit+ u:sign u:dot)) | ||||||
| 
 | 
 | ||||||
|   (define (read-char* p ls str who ci? delimited?) |   (define (read-char* p ls str who ci? delimited?) | ||||||
|     (let f ([i 0] [ls ls]) |     (let f ([i 0] [ls ls]) | ||||||
|  | @ -742,7 +742,7 @@ | ||||||
|         [(char<=? #\0 c #\9)  |         [(char<=? #\0 c #\9)  | ||||||
|          (let ([d (fx- (char->integer c) (char->integer #\0))]) |          (let ([d (fx- (char->integer c) (char->integer #\0))]) | ||||||
|            (cons 'datum |            (cons 'datum | ||||||
|              (digit+ p (list c) 10 #f +1 d)))] |              (u:digit+ p (list c) 10 #f #f +1 d)))] | ||||||
|         [(initial? c) |         [(initial? c) | ||||||
|          (let ([ls (reverse (tokenize-identifier (cons c '()) p))]) |          (let ([ls (reverse (tokenize-identifier (cons c '()) p))]) | ||||||
|            (cons 'datum (string->symbol (list->string ls))))] |            (cons 'datum (string->symbol (list->string ls))))] | ||||||
|  | @ -756,7 +756,7 @@ | ||||||
|              [(delimiter? c)  '(datum . +)] |              [(delimiter? c)  '(datum . +)] | ||||||
|              [else |              [else | ||||||
|               (cons 'datum |               (cons 'datum | ||||||
|                 (sign p '(#\+) 10 #f +1))]))] |                 (u:sign p '(#\+) 10 #f #f +1))]))] | ||||||
|         [(memq c '(#\-)) |         [(memq c '(#\-)) | ||||||
|          (let ([c (peek-char p)]) |          (let ([c (peek-char p)]) | ||||||
|            (cond |            (cond | ||||||
|  | @ -769,7 +769,7 @@ | ||||||
|                   (cons 'datum (string->symbol str))))] |                   (cons 'datum (string->symbol str))))] | ||||||
|              [else |              [else | ||||||
|               (cons 'datum |               (cons 'datum | ||||||
|                 (sign p '(#\-) 10 #f -1))]))] |                 (u:sign p '(#\-) 10 #f #f -1))]))] | ||||||
|         [($char= #\. c) |         [($char= #\. c) | ||||||
|          (tokenize-dot p)] |          (tokenize-dot p)] | ||||||
|         [($char= #\| c) |         [($char= #\| c) | ||||||
|  |  | ||||||
|  | @ -120,86 +120,79 @@ | ||||||
|                       orig* |                       orig* | ||||||
|                       [name* (arg** ...) clause** ...] ...)])))])))) |                       [name* (arg** ...) clause** ...] ...)])))])))) | ||||||
| 
 | 
 | ||||||
| 
 |   (define (mkrec n0 n1) | ||||||
|  |     (if n0 (make-rectangular n0 n1) (make-rectangular 0 n1))) | ||||||
| 
 | 
 | ||||||
|   (define-parser define-string->number-parser next fail |   (define-parser define-string->number-parser next fail | ||||||
| 
 | 
 | ||||||
|     (ratio+ (r ex sn num ac) |     (u:ratio+ (r n0 ex sn num ac) | ||||||
|       [(eof) |      [(eof) | ||||||
|        (if (= ac 0) |       (if (or n0 (= ac 0)) | ||||||
|            (fail) |           (fail) | ||||||
|            (do-sn/ex sn ex (/ num ac)))] |           (do-sn/ex sn ex (/ num ac)))] | ||||||
|       [(digit r) => d |       [(digit r) => d | ||||||
|        (next ratio+ r ex sn num (+ (* ac r) d))] |        (next u:ratio+ r n0 ex sn num (+ (* ac r) d))] | ||||||
|       [(#\+) |       [(#\+) | ||||||
|        (if (= ac 0) |        (if (or n0 (= ac 0)) | ||||||
|            (fail) |            (fail) | ||||||
|            (let ([real (do-sn/ex sn ex (/ num ac))]) |            (let ([real (do-sn/ex sn ex (/ num ac))]) | ||||||
|              (next im:sign r real ex +1)))] |              (next u:sign r real ex +1)))] | ||||||
|       [(#\-) |       [(#\-) | ||||||
|        (if (= ac 0) |        (if (or n0 (= ac 0)) | ||||||
|            (fail) |            (fail) | ||||||
|            (let ([real (do-sn/ex sn ex (/ num ac))]) |            (let ([real (do-sn/ex sn ex (/ num ac))]) | ||||||
|              (next im:sign r real ex -1)))] |              (next u:sign r real ex -1)))] | ||||||
|       [(#\@) |       [(#\@) | ||||||
|        (if (= ac 0) |        (if (or n0 (= ac 0)) | ||||||
|            (fail) |            (fail) | ||||||
|            (let ([mag (do-sn/ex sn ex (/ num ac))]) |            (let ([mag (do-sn/ex sn ex (/ num ac))]) | ||||||
|              (next polar r mag ex)))] |              (next polar r mag ex)))] | ||||||
|       [(#\i) |  | ||||||
|        (if (= ac 0) |  | ||||||
|            (fail) |  | ||||||
|            (next im:done |  | ||||||
|              (make-rectangular 0 (do-sn/ex sn ex (/ num ac)))))]) |  | ||||||
| 
 |  | ||||||
|     (im:ratio+ (r real ex sn num ac) |  | ||||||
|       [(digit r) => d |  | ||||||
|        (next im:ratio+ r real ex sn num (+ (* ac r) d))] |  | ||||||
|       [(#\i)  |       [(#\i)  | ||||||
|        (if (= ac 0) |        (if (= ac 0) | ||||||
|            (fail) |            (fail) | ||||||
|            (next im:done  |            (next u:done (mkrec n0 (do-sn/ex sn ex (/ num ac)))))]) | ||||||
|              (make-rectangular real (do-sn/ex sn ex (/ num ac)))))]) |  | ||||||
| 
 | 
 | ||||||
|     (im:done (n) |     (u:ratio (r n0 ex sn num) | ||||||
|  |       [(digit r) => d | ||||||
|  |        (next u:ratio+ r n0 ex sn num d)]) | ||||||
|  | 
 | ||||||
|  |     (u:done (n) | ||||||
|       [(eof) n]) |       [(eof) n]) | ||||||
| 
 | 
 | ||||||
|     (ratio (r ex sn num) |  | ||||||
|       [(digit r) => d |  | ||||||
|        (next ratio+ r ex sn num d)]) |  | ||||||
| 
 |  | ||||||
|     (im:ratio (r real ex sn num) |  | ||||||
|       [(digit r) => d |  | ||||||
|        (next im:ratio+ r real ex sn num d)]) |  | ||||||
| 
 |  | ||||||
|     (exponent+digit (r ex sn ac exp1 exp2 exp-sign) |  | ||||||
|       [(eof) |  | ||||||
|        (do-dec-sn/ex sn ex (* ac (expt 10 (+ exp1 (* exp2 exp-sign)))))] |  | ||||||
|       [(#\+)  |  | ||||||
|        (let ([real (do-dec-sn/ex sn ex (* ac (expt 10 (+ exp1 (* exp2 exp-sign)))))]) |  | ||||||
|          (next im:sign r real ex +1))] |  | ||||||
|       [(#\-)  |  | ||||||
|        (let ([real (do-dec-sn/ex sn ex (* ac (expt 10 (+ exp1 (* exp2 exp-sign)))))]) |  | ||||||
|          (next im:sign r real ex -1))] |  | ||||||
| 
 |  | ||||||
|       [(#\@)  |  | ||||||
|        (let ([mag (do-dec-sn/ex sn ex (* ac (expt 10 (+ exp1 (* exp2 exp-sign)))))]) |  | ||||||
|          (next polar r mag ex))] |  | ||||||
|       [(digit r) => d |  | ||||||
|        (next exponent+digit r ex sn ac exp1 (+ (* exp2 r) d) exp-sign)] |  | ||||||
|       [(#\i)  |  | ||||||
|        (let ([n (do-dec-sn/ex sn ex  |  | ||||||
|                   (* ac (expt 10 (+ exp1 (* exp2 exp-sign)))))]) |  | ||||||
|          (next im:done (make-rectangular 0 n)))]) |  | ||||||
| 
 |  | ||||||
|     (polar (r mag ex) |     (polar (r mag ex) | ||||||
|       [(digit r) => d  |       [(digit r) => d  | ||||||
|        (next polar+digit r mag ex d 1)] |        (next polar+digit r mag ex d 1)] | ||||||
|       [(#\.)  |       [(#\.)  | ||||||
|        (if (= r 10) |        (if (= r 10) | ||||||
|            (next polar+dot r mag ex +1) |            (next polar+dot r mag ex +1) | ||||||
|            (fail))]) |            (fail))] | ||||||
|  |       [(#\+)  | ||||||
|  |        (next polar+sign r mag ex +1)] | ||||||
|  |       [(#\-)  | ||||||
|  |        (next polar+sign r mag ex -1)]) | ||||||
|  | 
 | ||||||
|  |     (polar+sign (r mag ex sn) | ||||||
|  |       [(digit r) => d  | ||||||
|  |        (next polar+digit r mag ex d sn)] | ||||||
|  |       [(#\.) | ||||||
|  |        (if (= r 10) | ||||||
|  |            (next polar+dot r mag ex sn) | ||||||
|  |            (fail))] | ||||||
|  |       [(#\n) | ||||||
|  |        (next pol:sign-n (make-polar mag +nan.0))] | ||||||
|  |       [(#\i) | ||||||
|  |        (next pol:sign-i (make-polar mag (* +inf.0 sn)))]) | ||||||
|      |      | ||||||
|  |      (pol:sign-n (n) [(#\a) (next pol:sign-na n)]) | ||||||
|  |      (pol:sign-na (n) [(#\n) (next pol:sign-nan n)]) | ||||||
|  |      (pol:sign-nan (n) [(#\.) (next pol:sign-nan. n)]) | ||||||
|  |      (pol:sign-nan. (n) [(#\0) (next u:done n)]) | ||||||
|  | 
 | ||||||
|  |      (pol:sign-i (n) [(#\n) (next pol:sign-in n)]) | ||||||
|  |      (pol:sign-in (n) [(#\f) (next pol:sign-inf n)]) | ||||||
|  |      (pol:sign-inf (n) [(#\.) (next pol:sign-inf. n)]) | ||||||
|  |      (pol:sign-inf. (n) [(#\0) (next u:done n)]) | ||||||
|  | 
 | ||||||
|     (polar+dot (r mag ex sn) |     (polar+dot (r mag ex sn) | ||||||
|       [(digit r) => d  |       [(digit r) => d  | ||||||
|        (next polar+digit+dot r mag ex d sn -1)]) |        (next polar+digit+dot r mag ex d sn -1)]) | ||||||
|  | @ -220,189 +213,157 @@ | ||||||
|       [(digit r) => d |       [(digit r) => d | ||||||
|        (next polar+digit+dot r mag ex (+ (* r ang) d) sn (- exp 1))]) |        (next polar+digit+dot r mag ex (+ (* r ang) d) sn (- exp 1))]) | ||||||
| 
 | 
 | ||||||
|     (im:exponent+digit (r real ex sn ac exp1 exp2 exp-sign) | 
 | ||||||
|  | 
 | ||||||
|  |     (u:exponent+digit (r n0 ex sn ac exp1 exp2 exp-sign) | ||||||
|  |       [(eof) | ||||||
|  |        (if n0 | ||||||
|  |            (fail) | ||||||
|  |            (do-dec-sn/ex sn ex (* ac (expt 10 (+ exp1 (* exp2 exp-sign))))))] | ||||||
|       [(digit r) => d |       [(digit r) => d | ||||||
|        (next im:exponent+digit r real ex sn ac exp1 (+ (* exp2 r) d) exp-sign)] |        (next u:exponent+digit r n0 ex sn ac exp1 (+ (* exp2 r) d) exp-sign)] | ||||||
|  |       [(#\+)  | ||||||
|  |        (if n0 | ||||||
|  |            (fail) | ||||||
|  |            (let ([real (do-dec-sn/ex sn ex (* ac (expt 10 (+ exp1 (* exp2 exp-sign)))))]) | ||||||
|  |              (next u:sign r real ex +1)))] | ||||||
|  |       [(#\-)  | ||||||
|  |        (if n0 | ||||||
|  |            (fail) | ||||||
|  |            (let ([real (do-dec-sn/ex sn ex (* ac (expt 10 (+ exp1 (* exp2 exp-sign)))))]) | ||||||
|  |              (next u:sign r real ex -1)))] | ||||||
|  |       [(#\@)  | ||||||
|  |        (if n0 | ||||||
|  |            (fail) | ||||||
|  |            (let ([mag (do-dec-sn/ex sn ex (* ac (expt 10 (+ exp1 (* exp2 exp-sign)))))]) | ||||||
|  |              (next polar r mag ex)))] | ||||||
|       [(#\i) |       [(#\i) | ||||||
|        (let ([imag (do-dec-sn/ex sn ex |        (let ([n1 (do-dec-sn/ex sn ex  | ||||||
|                      (* ac (expt 10 (+ exp1 (* exp2 exp-sign)))))]) |                    (* ac (expt 10 (+ exp1 (* exp2 exp-sign)))))]) | ||||||
|          (next im:done (make-rectangular real imag)))]) |          (next u:done (mkrec n0 n1)))]) | ||||||
| 
 | 
 | ||||||
|     (exponent+sign (r ex sn ac exp1 exp-sign) |     (u:exponent+sign (r n0 ex sn ac exp1 exp-sign) | ||||||
|       [(digit r) => d |       [(digit r) => d | ||||||
|        (next exponent+digit r ex sn ac exp1 d exp-sign)]) |        (next u:exponent+digit r n0 ex sn ac exp1 d exp-sign)]) | ||||||
| 
 | 
 | ||||||
|     (im:exponent+sign (r real ex sn ac exp1 exp-sign) |     (u:exponent (r n0 ex sn ac exp1) | ||||||
|       [(digit r) => d |       [(digit r) => d | ||||||
|        (next im:exponent+digit r real ex sn ac exp1 d exp-sign)]) |        (next u:exponent+digit r n0 ex sn ac exp1 d +1)] | ||||||
|  |       [(#\+) (next u:exponent+sign r n0 ex sn ac exp1 +1)] | ||||||
|  |       [(#\-) (next u:exponent+sign r n0 ex sn ac exp1 -1)]) | ||||||
| 
 | 
 | ||||||
|     (exponent (r ex sn ac exp1) |     (u:digit+dot (r n0 ex sn ac exp) | ||||||
|       [(digit r) => d |  | ||||||
|        (next exponent+digit r ex sn ac exp1 d +1)] |  | ||||||
|       [(#\+) (next exponent+sign r ex sn ac exp1 +1)] |  | ||||||
|       [(#\-) (next exponent+sign r ex sn ac exp1 -1)]) |  | ||||||
| 
 |  | ||||||
|     (im:exponent (r real ex sn ac exp1) |  | ||||||
|       [(digit r) => d |  | ||||||
|        (next im:exponent+digit r real ex sn ac exp1 d +1)] |  | ||||||
|       [(#\+) (next im:exponent+sign r real ex sn ac exp1 +1)] |  | ||||||
|       [(#\-) (next im:exponent+sign r real ex sn ac exp1 -1)]) |  | ||||||
| 
 |  | ||||||
|     (digit+dot (r ex sn ac exp) |  | ||||||
|       [(eof) |       [(eof) | ||||||
|        (do-dec-sn/ex sn ex (* ac (expt 10 exp)))] |        (do-dec-sn/ex sn ex (* ac (expt 10 exp)))] | ||||||
|       [(digit r) => d |       [(digit r) => d | ||||||
|        (next digit+dot r ex sn (+ (* ac r) d) (- exp 1))] |        (next u:digit+dot r n0 ex sn (+ (* ac r) d) (- exp 1))] | ||||||
|  |       [(#\i) | ||||||
|  |        (let ([n1 (do-dec-sn/ex sn ex (* ac (expt 10 exp)))]) | ||||||
|  |          (next u:done (mkrec n0 n1)))] | ||||||
|       [(#\+) |       [(#\+) | ||||||
|        (let ([real (do-dec-sn/ex sn ex (* ac (expt 10 exp)))]) |        (if n0 | ||||||
|          (next im:sign r real ex +1))] |            (fail) | ||||||
|  |            (let ([real (do-dec-sn/ex sn ex (* ac (expt 10 exp)))]) | ||||||
|  |              (next u:sign r real ex +1)))] | ||||||
|       [(#\-) |       [(#\-) | ||||||
|        (let ([real (do-dec-sn/ex sn ex (* ac (expt 10 exp)))]) |        (if n0 | ||||||
|          (next im:sign r real ex -1))] |            (fail) | ||||||
|  |            (let ([real (do-dec-sn/ex sn ex (* ac (expt 10 exp)))]) | ||||||
|  |              (next u:sign r real ex -1)))] | ||||||
|       [(#\@) |       [(#\@) | ||||||
|        (let ([mag (do-dec-sn/ex sn ex (* ac (expt 10 exp)))]) |        (if n0  | ||||||
|          (next polar r mag ex))] |            (fail) | ||||||
|       [(#\i) |            (let ([mag (do-dec-sn/ex sn ex (* ac (expt 10 exp)))]) | ||||||
|        (let ([real (do-dec-sn/ex sn ex (* ac (expt 10 exp)))]) |              (next polar r mag ex)))] | ||||||
|          (next im:done (make-rectangular 0.0 real)))] |  | ||||||
|       [(#\e #\E #\s #\S #\f #\F #\d #\D #\l #\L) |       [(#\e #\E #\s #\S #\f #\F #\d #\D #\l #\L) | ||||||
|        (if (fx=? r 10) |        (if (fx=? r 10) | ||||||
|            (next exponent r ex sn ac exp) |            (next u:exponent r n0 ex sn ac exp) | ||||||
|            (fail))]) |            (fail))]) | ||||||
| 
 | 
 | ||||||
|     (im:digit+dot (r real ex sn ac exp) |  | ||||||
|       [(eof) |  | ||||||
|        (do-dec-sn/ex sn ex (* ac (expt 10 exp)))] |  | ||||||
|       [(digit r) => d |  | ||||||
|        (next im:digit+dot r real ex sn (+ (* ac r) d) (- exp 1))] |  | ||||||
|       [(#\i) |  | ||||||
|        (let ([imag (do-dec-sn/ex sn ex (* ac (expt 10 exp)))]) |  | ||||||
|          (next im:done (make-rectangular real imag)))] |  | ||||||
|       [(#\e #\E #\s #\S #\f #\F #\d #\D #\l #\L) |  | ||||||
|        (next im:exponent r real ex sn ac exp)]) |  | ||||||
| 
 | 
 | ||||||
|     (digit+ (r ex sn ac) |     (u:digit+ (r n0 ex sn ac) | ||||||
|       [(eof) (do-sn/ex sn ex ac)] |       [(eof)  | ||||||
|  |        (let ([n1 (do-sn/ex sn ex ac)]) | ||||||
|  |          (if n0  | ||||||
|  |              (make-rectangular n0 n1) | ||||||
|  |              n1))] | ||||||
|       [(digit r) => d |       [(digit r) => d | ||||||
|        (next digit+ r ex sn (+ (* ac r) d))] |        (next u:digit+ r n0 ex sn (+ (* ac r) d))] | ||||||
|       [(#\/) (next ratio r ex sn ac)] |  | ||||||
|       [(#\.) |       [(#\.) | ||||||
|        (if (fx=? r 10)  |        (if (fx=? r 10) | ||||||
|            (next digit+dot r ex sn ac 0) |            (next u:digit+dot r n0 ex sn ac 0) | ||||||
|            (fail))] |            (fail))] | ||||||
|  |       [(#\/) (next u:ratio r n0 ex sn ac)] | ||||||
|       [(#\+) |       [(#\+) | ||||||
|        (let ([real (do-sn/ex sn ex ac)]) |        (if n0  | ||||||
|          (next im:sign r real ex +1))] |            (fail) | ||||||
|  |            (let ([real (do-sn/ex sn ex ac)]) | ||||||
|  |              (next u:sign r real ex +1)))] | ||||||
|       [(#\-) |       [(#\-) | ||||||
|        (let ([real (do-sn/ex sn ex ac)]) |        (if n0  | ||||||
|          (next im:sign r real ex -1))] |            (fail) | ||||||
|  |            (let ([real (do-sn/ex sn ex ac)]) | ||||||
|  |              (next u:sign r real ex -1)))] | ||||||
|  |       [(#\i) | ||||||
|  |        (next u:done (mkrec n0 (do-sn/ex sn ex ac)))] | ||||||
|       [(#\@) |       [(#\@) | ||||||
|        (let ([mag (do-sn/ex sn ex ac)]) |        (if n0 | ||||||
|          (next polar r mag ex))] |            (fail) | ||||||
|       [(#\i) |            (let ([mag (do-sn/ex sn ex ac)]) | ||||||
|        (next im:done (make-rectangular 0 (do-sn/ex sn ex ac)))] |              (next polar r mag ex)))] | ||||||
|       [(#\e #\E #\s #\S #\f #\F #\d #\D #\l #\L) |  | ||||||
|        (if (fx=? r 10)  |  | ||||||
|            (next exponent r ex sn ac 0) |  | ||||||
|            (fail))]) |  | ||||||
| 
 |  | ||||||
|     (im:digit+ (r real ex sn ac) |  | ||||||
|       [(digit r) => d |  | ||||||
|        (next im:digit+ r real ex sn (+ (* ac r) d))] |  | ||||||
|       [(#\.) |  | ||||||
|        (if (fx=? r 10) |  | ||||||
|            (next im:digit+dot r real ex sn ac 0) |  | ||||||
|            (fail))] |  | ||||||
|       [(#\/) |  | ||||||
|        (next im:ratio r real ex sn ac)] |  | ||||||
|       [(#\i) |  | ||||||
|        (next im:done (make-rectangular real (do-sn/ex sn ex ac)))] |  | ||||||
|       [(#\e #\E #\s #\S #\f #\F #\d #\D #\l #\L) |       [(#\e #\E #\s #\S #\f #\F #\d #\D #\l #\L) | ||||||
|        (if (fx=? r 10) |        (if (fx=? r 10) | ||||||
|            (next im:exponent r real ex sn ac 0) |            (next u:exponent r n0 ex sn ac 0) | ||||||
|            (fail))]) |            (fail))]) | ||||||
| 
 | 
 | ||||||
|     (sign-i (r ex sn) | 
 | ||||||
|       [(eof) |     (u:sign-i (r n0 ex sn) | ||||||
|        (make-rectangular  |       [(eof) (mkrec n0 (do-sn/ex sn ex 1))] | ||||||
|          (if (eq? ex 'i) 0.0 0) |       [(#\n)  | ||||||
|          sn)] |        (if n0 | ||||||
|       [(#\n) (next sign-in r ex sn)]) |            (next u:sign-in r n0 (* sn +inf.0) ex) | ||||||
|     (sign-in (r ex sn) |            (next u:sign-in r (* sn +inf.0) #f ex))]) | ||||||
|       [(#\f) (next sign-inf r ex sn)]) |     (u:sign-in (r n0 n1 ex) | ||||||
|     (sign-inf (r ex sn) |       [(#\f) (next u:sign-inf r n0 n1 ex)]) | ||||||
|       [(#\.) (next sign-inf. r ex sn)]) |     (u:sign-inf (r n0 n1 ex) | ||||||
|     (sign-inf. (r ex sn) |       [(#\.) (next u:sign-inf. r n0 n1 ex)]) | ||||||
|       [(#\0) (next sign-inf.0 r ex sn)]) |     (u:sign-inf. (r n0 n1 ex) | ||||||
|     (sign-inf.0 (r ex sn) |       [(#\0) (next u:sign-inf.0 r n0 n1 ex)]) | ||||||
|       [(eof) (if (= sn 1) +inf.0 -inf.0)] ;(* sn +inf.0) |     (u:sign-inf.0 (r n0 n1 ex) | ||||||
|       [(#\+) (next im:sign r (* sn +inf.0) ex +1)] |       [(eof) (if n1 (make-rectangular n0 n1) n0)] | ||||||
|       [(#\-) (next im:sign r (* sn +inf.0) ex -1)] |       [(#\+) (if n1 (fail) (next u:sign r n0 ex +1))] | ||||||
|       [(#\@) (next polar r (* sn +inf.0) ex)] |       [(#\-) (if n1 (fail) (next u:sign r n0 ex -1))] | ||||||
|  |       [(#\@) (if n1 (fail) (next polar r n0 ex))] | ||||||
|       [(#\i)  |       [(#\i)  | ||||||
|        (next im:done (make-rectangular 0.0 (* sn +inf.0)))]) |        (next u:done | ||||||
|  |          (if n1  | ||||||
|  |              (make-rectangular n0 n1) | ||||||
|  |              (make-rectangular 0.0 n0)))]) | ||||||
| 
 | 
 | ||||||
|     (im:sign-i (real ex sn) |     (u:dot (r n0 ex sn) | ||||||
|       [(eof) (make-rectangular real (do-sn/ex sn ex 1))] |  | ||||||
|       [(#\n) (next im:sign-in (make-rectangular real (* sn +inf.0)))]) |  | ||||||
|     (im:sign-in (n) |  | ||||||
|       [(#\f) (next im:sign-inf n)]) |  | ||||||
|     (im:sign-inf (n) |  | ||||||
|       [(#\.) (next im:sign-inf. n)]) |  | ||||||
|     (im:sign-inf. (n) |  | ||||||
|       [(#\0) (next im:sign-inf.0 n)]) |  | ||||||
|     (im:sign-inf.0 (n) |  | ||||||
|       [(#\i) (next im:done n)]) |  | ||||||
| 
 |  | ||||||
|     (im:sign-n (n) [(#\a) (next im:sign-na n)]) |  | ||||||
|     (im:sign-na (n) [(#\n) (next im:sign-nan n)]) |  | ||||||
|     (im:sign-nan (n) [(#\.) (next im:sign-nan. n)]) |  | ||||||
|     (im:sign-nan. (n) [(#\0) (next im:sign-nan.0 n)]) |  | ||||||
|     (im:sign-nan.0 (n) [(#\i) (next im:done n)]) |  | ||||||
| 
 |  | ||||||
|     (dot (r ex sn) |  | ||||||
|       [(digit r) => d |       [(digit r) => d | ||||||
|        (next digit+dot r ex sn d -1)]) |        (next u:digit+dot r n0 ex sn d -1)]) | ||||||
|      |  | ||||||
|     (im:dot (r real ex sn) |  | ||||||
|       [(digit r) => d |  | ||||||
|        (next im:digit+dot r real ex sn d -1)]) |  | ||||||
| 
 | 
 | ||||||
|     (im:sign (r real ex sn) |     (u:sign (r n0 ex sn) | ||||||
|       [(digit r) => d |       [(digit r) => d | ||||||
|        (next im:digit+ r real ex sn d)] |        (next u:digit+ r n0 ex sn d)] | ||||||
|       [(#\i)  |       [(#\i) (next u:sign-i r n0 ex sn)] | ||||||
|        (next im:sign-i real ex sn)] |       [(#\n) (next u:sign-n r n0 ex)] | ||||||
|       [(#\n) |       [(#\.)  | ||||||
|        (next im:sign-n (make-rectangular real +nan.0))] |        (if (= r 10) | ||||||
|       [(#\.) |            (next u:dot r n0 ex sn) | ||||||
|        (if (fx=? r 10) |  | ||||||
|            (next im:dot r real ex sn) |  | ||||||
|            (fail))]) |            (fail))]) | ||||||
| 
 | 
 | ||||||
|     (sign (r ex sn) |     (u:sign-n (r n0 ex) [(#\a) (next u:sign-na r n0 ex)]) | ||||||
|       [(digit r) => d |     (u:sign-na (r n0 ex) [(#\n) (next u:sign-nan r n0 ex)]) | ||||||
|        (next digit+ r ex sn d)] |     (u:sign-nan (r n0 ex) [(#\.) (next u:sign-nan. r n0 ex)]) | ||||||
|       [(#\i) |     (u:sign-nan. (r n0 ex) [(#\0) (next u:sign-nan.0 r n0 ex)]) | ||||||
|        (next sign-i r ex sn)] |     (u:sign-nan.0 (r n0 ex) | ||||||
|       [(#\.) |       [(eof) (if n0 (make-rectangular n0 +nan.0) +nan.0)] | ||||||
|        (if (fx=? r 10) |       [(#\+) (if n0 (fail) (next u:sign r +nan.0 ex +1))] | ||||||
|            (next dot r ex sn) |       [(#\-) (if n0 (fail) (next u:sign r +nan.0 ex -1))] | ||||||
|            (fail))] |       [(#\@) (if n0 (fail) (next polar r +nan.0 ex))] | ||||||
|       [(#\n) |       [(#\i) (next u:done (mkrec n0 +nan.0))]) | ||||||
|        (next sign-n r ex)]) |  | ||||||
|     (sign-n (r ex) [(#\a) (next sign-na r ex)]) |  | ||||||
|     (sign-na (r ex) [(#\n) (next sign-nan r ex)]) |  | ||||||
|     (sign-nan (r ex) [(#\.) (next sign-nan. r ex)]) |  | ||||||
|     (sign-nan. (r ex) [(#\0) (next sign-nan.0 r ex)]) |  | ||||||
|     (sign-nan.0 (r ex) |  | ||||||
|       [(eof) +nan.0] |  | ||||||
|       [(#\+) (next im:sign r +nan.0 ex +1)] |  | ||||||
|       [(#\-) (next im:sign r +nan.0 ex -1)] |  | ||||||
|       [(#\@) (next polar r +nan.0 ex)] |  | ||||||
|       [(#\i) (next sign-nan.0i r ex)]) |  | ||||||
|     (sign-nan.0i (r ex) |  | ||||||
|       [(eof) (make-rectangular 0.0 +nan.0)]) |  | ||||||
| 
 | 
 | ||||||
|     (parse-string-h (dr r ex) |     (parse-string-h (dr r ex) | ||||||
|       [(#\x #\X) |       [(#\x #\X) | ||||||
|  | @ -420,14 +381,14 @@ | ||||||
| 
 | 
 | ||||||
|     (parse-string (dr r ex) |     (parse-string (dr r ex) | ||||||
|       [(#\#) (next parse-string-h dr r ex)] |       [(#\#) (next parse-string-h dr r ex)] | ||||||
|       [(#\+) (next sign dr ex +1)] |       [(#\+) (next u:sign dr #f ex +1)] | ||||||
|       [(#\-) (next sign dr ex -1)] |       [(#\-) (next u:sign dr #f ex -1)] | ||||||
|       [(#\.) |       [(#\.) | ||||||
|        (if (fx=? dr 10)  |        (if (fx=? dr 10) | ||||||
|            (next dot dr ex +1) |            (next u:dot dr #f ex +1) | ||||||
|            (fail))] |            (fail))] | ||||||
|       [(digit dr) => d |       [(digit dr) => d | ||||||
|        (next digit+ dr ex +1 d)]) |        (next u:digit+ dr #f ex +1 d)]) | ||||||
|   ) |   ) | ||||||
| 
 | 
 | ||||||
|   (define-syntax string-config |   (define-syntax string-config | ||||||
|  | @ -479,7 +440,7 @@ | ||||||
| ;;;                     | <real R> "+" <naninf> "i" | ;;;                     | <real R> "+" <naninf> "i" | ||||||
| ;;;                     | <real R> "-" <naninf> "i" | ;;;                     | <real R> "-" <naninf> "i" | ||||||
| ;;;                     | <real R> "+" "i" | ;;;                     | <real R> "+" "i" | ||||||
| ;;;                     | <real R> "-"  "i" | ;;;                     | <real R> "-" "i" | ||||||
| ;;;                     | "+" <ureal R> "i" | ;;;                     | "+" <ureal R> "i" | ||||||
| ;;;                     | "-" <ureal R> "i" | ;;;                     | "-" <ureal R> "i" | ||||||
| ;;;                     | "+" <naninf> "i" | ;;;                     | "+" <naninf> "i" | ||||||
|  |  | ||||||
|  | @ -1 +1 @@ | ||||||
| 1834 | 1835 | ||||||
|  |  | ||||||
|  | @ -7,7 +7,8 @@ | ||||||
|   (import (ikarus) (tests framework)) |   (import (ikarus) (tests framework)) | ||||||
| 
 | 
 | ||||||
|   (define (run-tests) |   (define (run-tests) | ||||||
|     (test-string-to-number)) |     (test-string-to-number) | ||||||
|  |     (generated-tests)) | ||||||
| 
 | 
 | ||||||
|   (define (test string expected) |   (define (test string expected) | ||||||
|     (define (equal-results? x y) |     (define (equal-results? x y) | ||||||
|  | @ -249,6 +250,90 @@ | ||||||
|     (test "+.234i" (make-rectangular 0 0.234)) |     (test "+.234i" (make-rectangular 0 0.234)) | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
|  |   (define (generated-tests) | ||||||
|  |      | ||||||
|  |     (define (gen ls1 ls2 comp1 comp2) | ||||||
|  |       (apply append | ||||||
|  |         (map (lambda (x1) | ||||||
|  |                (map (lambda (x2) | ||||||
|  |                       (cons (comp1 (car x1) (car x2)) | ||||||
|  |                             (comp2 (cdr x1) (cdr x2)))) | ||||||
|  |                     ls2)) | ||||||
|  |              ls1))) | ||||||
|  | 
 | ||||||
|  |     (define (gensa ls1 ls2 comp) | ||||||
|  |       (gen ls1 ls2 string-append comp)) | ||||||
|  | 
 | ||||||
|  |     (define ureal | ||||||
|  |       '(["0" . 0] | ||||||
|  |         ["1" . 1] | ||||||
|  |         ["1." . 1.0] | ||||||
|  |         ["1.0" . 1.0] | ||||||
|  |         [".5" . 0.5] | ||||||
|  |         ["0.5" . 0.5] | ||||||
|  |         ["1e1" . 10.0] | ||||||
|  |         ["1e+1" . 10.0] | ||||||
|  |         ["1e-1" . 0.1] | ||||||
|  |         ["1.e1" . 10.0] | ||||||
|  |         ["1.e+1" . 10.0] | ||||||
|  |         ["1.e-1" . 0.1] | ||||||
|  |         ["1.0e1" . 10.0] | ||||||
|  |         ["1.0e+1" . 10.0] | ||||||
|  |         ["1.0e-1" . 0.1] | ||||||
|  |         [".5e1" . 5.0] | ||||||
|  |         [".5e+1" . 5.0] | ||||||
|  |         [".5e-1" . 0.05] | ||||||
|  |         )) | ||||||
|  | 
 | ||||||
|  |     (define naninf | ||||||
|  |       '(["nan.0" . +nan.0] | ||||||
|  |         ["inf.0" . +inf.0])) | ||||||
|  | 
 | ||||||
|  |     (define sign | ||||||
|  |       '(["+" . +1] | ||||||
|  |         ["-" . -1])) | ||||||
|  | 
 | ||||||
|  |     ;;; <real> = <sign> <ureal> | ||||||
|  |     ;;;        | + <naninf> | ||||||
|  |     ;;;        | - <naninf> | ||||||
|  | 
 | ||||||
|  |     (define sreal | ||||||
|  |       (append  | ||||||
|  |         (gensa sign ureal *) | ||||||
|  |         (gensa sign naninf *))) | ||||||
|  |     (define real | ||||||
|  |       (append ureal sreal)) | ||||||
|  | 
 | ||||||
|  |     ;;;<complex> = <real> | ||||||
|  |     ;;;          | <real> @ <real> | ||||||
|  |     ;;;          | <real> <creal> | ||||||
|  |     ;;;          | <creal> | ||||||
|  |     ;;; <creal> = <seal> i | ||||||
|  |     ;;;         | +i | ||||||
|  |     ;;;         | -i | ||||||
|  | 
 | ||||||
|  |     (define creal | ||||||
|  |       (append | ||||||
|  |         (gensa sreal '(["i" . #f]) (lambda (x f) (make-rectangular 0 x))) | ||||||
|  |         `(["+i" . ,(make-rectangular 0 1)] | ||||||
|  |           ["-i" . ,(make-rectangular 0 -1)]))) | ||||||
|  | 
 | ||||||
|  |     (define complex | ||||||
|  |       (append | ||||||
|  |         real creal | ||||||
|  |         (gensa real creal +) | ||||||
|  |         ;(gen real real (lambda (x y) (string-append x "@" y)) make-polar) | ||||||
|  |         )) | ||||||
|  | 
 | ||||||
|  |     (printf "TESTING ~s tests\n" (length complex)) | ||||||
|  |     (for-each | ||||||
|  |       (lambda (x) | ||||||
|  |         (test (car x) (cdr x))) | ||||||
|  |       complex) | ||||||
|  | 
 | ||||||
|  |     ) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|   ) |   ) | ||||||
|      |      | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Abdulaziz Ghuloum
						Abdulaziz Ghuloum