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 ;