[racket] reader.html: documentation for complex number reading

From: Matthew Flatt (mflatt at cs.utah.edu)
Date: Thu Mar 28 23:03:15 EDT 2013

Let's fix the docs. My current attempt is

 ‹exact-rationaln›    ::=  [‹sign›] ‹unsigned-rationaln›
 ‹unsigned-rationaln› ::= ‹unsigned-integern› 
                        | ‹unsigned-integern› / ‹unsigned-integern›
 ‹exact-integern›     ::= [‹sign›] ‹unsigned-integern›
 ‹unsigned-integern›  ::= ‹digitn›+

Does that look right?


FWIW, there are number-parsing regexp constructions in

 collects/r6rs/private/readtable.rkt (see `rx:number')

and

 collects/syntax-color/racket-lexer.rkt (see `make-num')

The first, as the path suggests, is R6RS instead of Racket.

The latter is known to mishandle cases like "#x1E+2" (because "E" is
not an exponent marker for hexadecimal), but I'll push a fix for that.
And I'll fix it for extflonums, too.

At Tue, 26 Mar 2013 16:04:18 +0000, Tim Brown wrote:
> Folks,
> 
> I'm trying to get a GeSHi highlighter together for racket (in support of,
> amongst other things) rosettacode.
> 
> I have the regular expression below for matching racket numbers (it is
> about three characters shorter than just listing all exact and inexact
> complex numbers). However, it does not match "2+3i".
> 
> According to the reader documentation:
> 
> ‹exact-complexn› ::= ‹exact-rationaln› ‹sign› ‹unsigned-rationaln› i
> ‹exact-rationaln› ::= [‹sign›] ‹unsigned-rationaln›
> ‹unsigned-rationaln› ::= ‹unsigned-integern› / ‹unsigned-integern›
> 
> Both the exact-rational and the unsigned-rational require both a numerator
> AND a denominator. There is no rule in the (documented) reader grammar for
> an exact-complex of:
> 
>   (integer | exact-rational) sign (unsigned-integer |
> unsigned-exact-rational) "i"
> 
> Inexact complex is more forgiving (but with many more options).
> 
> Of course, if anyone has a simpler I can use, I'd be interested.
> Or I could stick with [0-9]+
> 
> Tim Brown
> 
> The regex... should work with everything but: "2+3i"
> 
> ((((#b)(((((#e)|(#i)))((((((((((((-)|(\+)))?)((([0-9]+)(\\/)([0-9]+)))))(((-)|(\
> +)))((([0-9]+)(\\/)([0-9]+)))(i)))|((((((-)|(\+)))?)((([0-9]+)(\\/)([0-9]+)))))|
> ((((((-)|(\+)))?)([0-9]+)))))|(((((((((((((((-)|(\+)))?)(((((((((([0-1])+)((#)*)
> ))((\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-1])+)((#)*)))))|(((((([0-1])+)((#)*
> )))(\\/)(((([0-1])+)((#)*)))))))(((((([sl])|([def])))((((((-)|(\+)))?)([0-9]+)))
> ))?)))))|(((((-)|(\+)))(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))))?)(((-)|(\+)))
> (((((((((((([0-1])+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-1])+)((#)
> *)))))|(((((([0-1])+)((#)*)))(\\/)(((([0-1])+)((#)*)))))))(((((([sl])|([def])))(
> (((((-)|(\+)))?)([0-9]+)))))?)))|(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))(i)))|
> ((((((((((-)|(\+)))?)(((((((((([0-1])+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.
> )?)(((([0-1])+)((#)*)))))|(((((([0-1])+)((#)*)))(\\/)(((([0-1])+)((#)*)))))))(((
> ((([sl])|([def])))((((((-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(\+)))(((inf\.0)|(
> nan\.0)|(inf\.f)|(nan\.f)))))))(@)((((((((-)|(\+)))?)(((((((((([0-1])+)((#)*)))(
> (\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-1])+)((#)*)))))|(((((([0-1])+)((#)*)))
> (\\/)(((([0-1])+)((#)*)))))))(((((([sl])|([def])))((((((-)|(\+)))?)([0-9]+)))))?
> )))))|(((((-)|(\+)))(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))))))))|((((((((-)|(
> \+)))?)(((((((((([0-1])+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-1])+
> )((#)*)))))|(((((([0-1])+)((#)*)))(\\/)(((([0-1])+)((#)*)))))))(((((([sl])|([def
> ])))((((((-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(\+)))(((inf\.0)|(nan\.0)|(inf\.
> f)|(nan\.f)))))))))))))))|(((#o)(((((#e)|(#i)))((((((((((((-)|(\+)))?)((([0-9]+)
> (\\/)([0-9]+)))))(((-)|(\+)))((([0-9]+)(\\/)([0-9]+)))(i)))|((((((-)|(\+)))?)(((
> [0-9]+)(\\/)([0-9]+)))))|((((((-)|(\+)))?)([0-9]+)))))|(((((((((((((((-)|(\+)))?
> )(((((((((([0-7])+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-7])+)((#)*
> )))))|(((((([0-7])+)((#)*)))(\\/)(((([0-7])+)((#)*)))))))(((((([sl])|([def])))((
> ((((-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(\+)))(((inf\.0)|(nan\.0)|(inf\.f)|(na
> n\.f)))))))?)(((-)|(\+)))(((((((((((([0-7])+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)
> ?)((\.)?)(((([0-7])+)((#)*)))))|(((((([0-7])+)((#)*)))(\\/)(((([0-7])+)((#)*))))
> )))(((((([sl])|([def])))((((((-)|(\+)))?)([0-9]+)))))?)))|(((inf\.0)|(nan\.0)|(i
> nf\.f)|(nan\.f)))))(i)))|((((((((((-)|(\+)))?)(((((((((([0-7])+)((#)*)))((\.)?)(
> (#)*)))|(((([0-9]+)?)((\.)?)(((([0-7])+)((#)*)))))|(((((([0-7])+)((#)*)))(\\/)((
> (([0-7])+)((#)*)))))))(((((([sl])|([def])))((((((-)|(\+)))?)([0-9]+)))))?)))))|(
> ((((-)|(\+)))(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))))(@)((((((((-)|(\+)))?)((
> (((((((([0-7])+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-7])+)((#)*)))
> ))|(((((([0-7])+)((#)*)))(\\/)(((([0-7])+)((#)*)))))))(((((([sl])|([def])))(((((
> (-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(\+)))(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.
> f)))))))))))|((((((((-)|(\+)))?)(((((((((([0-7])+)((#)*)))((\.)?)((#)*)))|(((([0
> -9]+)?)((\.)?)(((([0-7])+)((#)*)))))|(((((([0-7])+)((#)*)))(\\/)(((([0-7])+)((#)
> *)))))))(((((([sl])|([def])))((((((-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(\+)))(
> ((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))))))))))))|(((#x)(((((#e)|(#i)))((((((((
> ((((-)|(\+)))?)((([0-9]+)(\\/)([0-9]+)))))(((-)|(\+)))((([0-9]+)(\\/)([0-9]+)))(
> i)))|((((((-)|(\+)))?)((([0-9]+)(\\/)([0-9]+)))))|((((((-)|(\+)))?)([0-9]+)))))|
> (((((((((((((((-)|(\+)))?)(((((((((([0-9a-fA-F])+)((#)*)))((\.)?)((#)*)))|(((([0
> -9]+)?)((\.)?)(((([0-9a-fA-F])+)((#)*)))))|(((((([0-9a-fA-F])+)((#)*)))(\\/)((((
> [0-9a-fA-F])+)((#)*)))))))(((([sl])((((((-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(
> \+)))(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))))?)(((-)|(\+)))(((((((((((([0-9a-
> fA-F])+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-9a-fA-F])+)((#)*)))))
> |(((((([0-9a-fA-F])+)((#)*)))(\\/)(((([0-9a-fA-F])+)((#)*)))))))(((([sl])((((((-
> )|(\+)))?)([0-9]+)))))?)))|(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))(i)))|((((((
> ((((-)|(\+)))?)(((((((((([0-9a-fA-F])+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.
> )?)(((([0-9a-fA-F])+)((#)*)))))|(((((([0-9a-fA-F])+)((#)*)))(\\/)(((([0-9a-fA-F]
> )+)((#)*)))))))(((([sl])((((((-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(\+)))(((inf
> \.0)|(nan\.0)|(inf\.f)|(nan\.f)))))))(@)((((((((-)|(\+)))?)(((((((((([0-9a-fA-F]
> )+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-9a-fA-F])+)((#)*)))))|((((
> (([0-9a-fA-F])+)((#)*)))(\\/)(((([0-9a-fA-F])+)((#)*)))))))(((([sl])((((((-)|(\+
> )))?)([0-9]+)))))?)))))|(((((-)|(\+)))(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f))))))
> )))))|((((((((-)|(\+)))?)(((((((((([0-9a-fA-F])+)((#)*)))((\.)?)((#)*)))|(((([0-
> 9]+)?)((\.)?)(((([0-9a-fA-F])+)((#)*)))))|(((((([0-9a-fA-F])+)((#)*)))(\\/)(((([
> 0-9a-fA-F])+)((#)*)))))))(((([sl])((((((-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(\
> +)))(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))))))))))))|((((#d)?)(((((#e)|(#i)))
> ((((((((((((-)|(\+)))?)((([0-9]+)(\\/)([0-9]+)))))(((-)|(\+)))((([0-9]+)(\\/)([0
> -9]+)))(i)))|((((((-)|(\+)))?)((([0-9]+)(\\/)([0-9]+)))))|((((((-)|(\+)))?)([0-9
> ]+)))))|(((((((((((((((-)|(\+)))?)(((((((((([0-9])+)((#)*)))((\.)?)((#)*)))|((((
> [0-9]+)?)((\.)?)(((([0-9])+)((#)*)))))|(((((([0-9])+)((#)*)))(\\/)(((([0-9])+)((
> #)*)))))))(((((([sl])|([def])))((((((-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(\+))
> )(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))))?)(((-)|(\+)))(((((((((((([0-9])+)((
> #)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-9])+)((#)*)))))|(((((([0-9])+)(
> (#)*)))(\\/)(((([0-9])+)((#)*)))))))(((((([sl])|([def])))((((((-)|(\+)))?)([0-9]
> +)))))?)))|(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))(i)))|((((((((((-)|(\+)))?)(
> ((((((((([0-9])+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-9])+)((#)*))
> )))|(((((([0-9])+)((#)*)))(\\/)(((([0-9])+)((#)*)))))))(((((([sl])|([def])))((((
> ((-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(\+)))(((inf\.0)|(nan\.0)|(inf\.f)|(nan\
> .f)))))))(@)((((((((-)|(\+)))?)(((((((((([0-9])+)((#)*)))((\.)?)((#)*)))|(((([0-
> 9]+)?)((\.)?)(((([0-9])+)((#)*)))))|(((((([0-9])+)((#)*)))(\\/)(((([0-9])+)((#)*
> )))))))(((((([sl])|([def])))((((((-)|(\+)))?)([0-9]+)))))?)))))|(((((-)|(\+)))((
> (inf\.0)|(nan\.0)|(inf\.f)|(nan\.f)))))))))))|((((((((-)|(\+)))?)(((((((((([0-9]
> )+)((#)*)))((\.)?)((#)*)))|(((([0-9]+)?)((\.)?)(((([0-9])+)((#)*)))))|(((((([0-9
> ])+)((#)*)))(\\/)(((([0-9])+)((#)*)))))))(((((([sl])|([def])))((((((-)|(\+)))?)(
> [0-9]+)))))?)))))|(((((-)|(\+)))(((inf\.0)|(nan\.0)|(inf\.f)|(nan\.f))))))))))))
> ))))
> 
> --
> | Tim Brown <tim.brown at timb.net> | M:+44(0)7771714159 | H:+44(0)1372747875 |
> 
> ____________________
>   Racket Users list:
>   http://lists.racket-lang.org/users


Posted on the users mailing list.