integer.scm 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. ; Part of Scheme 48 1.9. See file COPYING for notices and license.
  2. ; Authors: Richard Kelsey, Jonathan Rees, Martin Gasbichler, Mike Sperber
  3. ; Operations on integers.
  4. ; These expect their arguments to be integers.
  5. (define integer-add bignum-add)
  6. (define integer-subtract bignum-subtract)
  7. (define integer-multiply bignum-multiply)
  8. (define integer-remainder bignum-remainder)
  9. (define integer-quotient bignum-quotient)
  10. (define integer-divide bignum-divide)
  11. (define integer-abs bignum-abs)
  12. ; Fixnums and bignums are disjoint.
  13. (define (integer= x y)
  14. (cond ((and (fixnum? x)
  15. (fixnum? y))
  16. (fixnum= x y))
  17. ((and (bignum? x)
  18. (bignum? y))
  19. (bignum= x y))
  20. (else
  21. #f)))
  22. ; Positive bignums are greater than all fixnums, negative bignums are less
  23. ; than all fixnums.
  24. (define (integer< x y)
  25. (cond ((fixnum? x)
  26. (if (fixnum? y)
  27. (fixnum< x y)
  28. (bignum-positive? y)))
  29. ((fixnum? y)
  30. (not (bignum-positive? x)))
  31. (else
  32. (bignum< x y))))
  33. (define (integer<= x y)
  34. (not (integer< y x)))
  35. (define (integer> x y)
  36. (integer< y x))
  37. (define (integer>= x y)
  38. (not (integer< x y)))
  39. (define integer-arithmetic-shift bignum-arithmetic-shift)
  40. (define integer-bitwise-not bignum-bitwise-not)
  41. (define integer-bit-count bignum-bit-count)
  42. (define integer-bitwise-and bignum-bitwise-and)
  43. (define integer-bitwise-ior bignum-bitwise-ior)
  44. (define integer-bitwise-xor bignum-bitwise-xor)
  45. (define (enter-integer x key)
  46. (if (or (too-big-for-fixnum? x)
  47. (too-small-for-fixnum? x))
  48. (long->bignum x key)
  49. (enter-fixnum x)))
  50. (define (enter-unsigned-integer x key)
  51. (if (unsigned-too-big-for-fixnum? x)
  52. (unsigned-long->bignum x key)
  53. (enter-fixnum (unsigned->integer x))))
  54. (define long-as-integer-size (bignum-bits-to-size 32))