1 ! Copyright (C) 2004, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel math.private namespaces make sequences strings
4 arrays combinators splitting math assocs ;
33 : string>digits ( str -- digits )
34 [ digit> ] { } map-as ;
36 : digits>integer ( seq radix -- n )
37 0 swap [ swapd * + ] curry reduce ;
46 : sign ( -- str ) negative? get "-" "+" ? ;
48 : with-radix ( radix quot -- )
49 radix swap with-variable ; inline
51 : (base>) ( str -- n ) radix get base> ;
53 : whole-part ( str -- m n )
54 sign split1 >r (base>) r>
55 dup [ (base>) ] [ drop 0 swap ] if ;
57 : string>ratio ( str -- a/b )
58 "-" ?head dup negative? set swap
59 "/" split1 (base>) >r whole-part r>
60 3dup and and [ / + swap [ neg ] when ] [ 2drop 2drop f ] if ;
62 : valid-digits? ( seq -- ? )
64 { [ dup empty? ] [ drop f ] }
65 { [ f over memq? ] [ drop f ] }
66 [ radix get [ < ] curry all? ]
69 : string>integer ( str -- n/f )
71 string>digits dup valid-digits?
72 [ radix get digits>integer swap [ neg ] when ] [ 2drop f ] if ;
76 : base> ( str radix -- n/f )
78 CHAR: / over member? [
81 CHAR: . over member? [
89 : string>number ( str -- n/f ) 10 base> ;
90 : bin> ( str -- n/f ) 2 base> ;
91 : oct> ( str -- n/f ) 8 base> ;
92 : hex> ( str -- n/f ) 16 base> ;
95 dup 10 < [ CHAR: 0 + ] [ 10 - CHAR: a + ] if ;
97 : integer, ( num radix -- )
98 dup 1 <= [ "Invalid radix" throw ] when
99 [ /mod >digit , ] keep over 0 >
100 [ integer, ] [ 2drop ] if ;
104 GENERIC# >base 1 ( n radix -- str )
108 : (>base) ( n -- str ) radix get >base ;
115 swap neg swap integer, CHAR: - ,
124 dup 0 < dup negative? set [ "-" % neg ] when
126 >r dup zero? [ drop ] [ (>base) % sign % ] if r>
127 dup numerator (>base) %
129 denominator (>base) %
133 : fix-float ( str -- newstr )
136 [ CHAR: e over member? ]
137 [ "e" split1 >r fix-float "e" r> 3append ]
139 [ CHAR: . over member? ]
147 { [ dup fp-nan? ] [ drop "0.0/0.0" ] }
148 { [ dup 1.0/0.0 = ] [ drop "1.0/0.0" ] }
149 { [ dup -1.0/0.0 = ] [ drop "-1.0/0.0" ] }
150 { [ dup double>bits HEX: 8000000000000000 = ] [ drop "-0.0" ] }
151 [ float>string fix-float ]
154 : number>string ( n -- str ) 10 >base ;
155 : >bin ( n -- str ) 2 >base ;
156 : >oct ( n -- str ) 8 >base ;
157 : >hex ( n -- str ) 16 >base ;
159 : # ( n -- ) number>string % ;