M: fixnum >bignum fixnum>bignum ; inline
M: fixnum >integer ; inline
M: fixnum >float fixnum>float ; inline
-M: fixnum integer>fixnum ; inline
-M: fixnum integer>fixnum-strict ; inline
M: fixnum hashcode* nip ; inline
M: fixnum equal? over bignum? [ >bignum bignum= ] [ 2drop f ] if ; inline
M: bignum >fixnum bignum>fixnum ; inline
M: bignum >bignum ; inline
-M: bignum integer>fixnum bignum>fixnum ; inline
-
-M: bignum integer>fixnum-strict
- dup bignum>fixnum
- 2dup number= [ nip ] [ drop out-of-fixnum-range ] if ; inline
M: bignum hashcode* nip bignum>fixnum ;
GENERIC: >bignum ( x -- n ) foldable
GENERIC: >integer ( x -- n ) foldable
GENERIC: >float ( x -- y ) foldable
-GENERIC: integer>fixnum ( x -- y ) foldable
-GENERIC: integer>fixnum-strict ( x -- y ) foldable
GENERIC: numerator ( a/b -- a )
GENERIC: denominator ( a/b -- b )
PRIVATE>
+ERROR: not-an-integer n ;
+
ERROR: out-of-fixnum-range n ;
ERROR: log2-expects-positive x ;
UNION: integer fixnum bignum ;
+: integer>fixnum ( m -- n )
+ dup fixnum? [
+ dup bignum? [ bignum>fixnum ] [ not-an-integer ] if
+ ] unless ; inline foldable
+
+: integer>fixnum-strict ( m -- n )
+ dup fixnum? [
+ dup bignum? [
+ dup bignum>fixnum 2dup number=
+ [ nip ] [ drop out-of-fixnum-range ] if
+ ] [ not-an-integer ] if
+ ] unless ; inline foldable
+
TUPLE: ratio { numerator integer read-only } { denominator integer read-only } ;
UNION: rational integer ratio ;