Fixed so that "1/pivot" is rejected as a number, rather than dividing
authorStephen Adams <edu/mit/csail/zurich/adams>
Tue, 7 Oct 1997 04:19:46 +0000 (04:19 +0000)
committerStephen Adams <edu/mit/csail/zurich/adams>
Tue, 7 Oct 1997 04:19:46 +0000 (04:19 +0000)
by zero.  Change: divide only if there is at least one denominator
digit.

This is not a good fix, but I need it now for some existing code.  The
parser ought to be restructured not to compute the real part until it
is known that the imaginary part is valid, e.g.

(string->number "1/2+3")  => #F
(string->number "1/0+3")  => error
(string->number "1/0-transition")  => error

There is a similar problem with exponent calculation:

(string->number "1e9999e1")  => error
(string->number "1e99999999e1")  => `hangs' in bignum primitives

Of course, the difficulty with these non-numbers is probably the
reason behind R4RS's restriction on valid identifiers.  That is pretty
feeble, since I don't recall R4RS saying that STRING->NUMBER is
allowed to signal an error.  Note that the current code would work
fine in a lazy language, so a few DELAYs and FORCEs might be the most
elegant fix (and OK effciency since FORCE is now compiled.)

v7/src/runtime/numpar.scm

index f2f7d5d855658d8344daabd9f74b01ff9f6a23ae..64d065ba5d857c3b3e66b8df0fa32f5d60221fce 100644 (file)
@@ -1,6 +1,6 @@
 #| -*-Scheme-*-
 
-$Id: numpar.scm,v 14.14 1997/07/20 06:38:55 cph Exp $
+$Id: numpar.scm,v 14.15 1997/10/07 04:19:46 adams Exp $
 
 Copyright (c) 1989-97 Massachusetts Institute of Technology
 
@@ -137,9 +137,8 @@ MIT in each case. |#
          (let ((char (string-ref string start))
                (start+1 (fix:+ start 1)))
            (cond ((char=? #\/ char)
-                  (and (fix:< start+1 end)
-                       (parse-denominator-1 string start+1 end
-                                            integer exactness radix sign)))
+                  (parse-denominator-1 string start+1 end
+                                       integer exactness radix sign))
                  ((char=? #\. char)
                   (and (fix:= radix 10)
                        (if sharp?
@@ -185,11 +184,12 @@ MIT in each case. |#
         (lambda (denominator exactness sign)
           (finish-rational numerator denominator exactness sign))))
     (parse-digits string start end 0 exactness radix
-      (lambda (start integer exactness sharp?)
+      (lambda (start* integer exactness sharp?)
        sharp?
-       (parse-complex string start end
-                      (finish integer exactness sign)
-                      exactness radix sign)))))
+       (and (> start* start) ; >0 denominator digits 
+            (parse-complex string start end
+                           (finish integer exactness sign)
+                           exactness radix sign))))))
 \f
 (define (parse-decimal-1 string start end exactness sign)
   ;; State: radix is 10, leading dot seen.