; Copyright (c) 1993-1999 by Richard Kelsey and Jonathan Rees. See file COPYING. ; Operations on integers. ; This expects its arguments to be integers. (define (integer-op fixnum-op bignum-op) (if (and (fixnum? x) (fixnum? y)) (fixnum-op x y (lambda (r) r) bignum-op) (bignum-op x y))) (define integer-add (integer-op add-carefully bignum-add)) (define integer-subtract (integer-op subtract-carefully bignum-subtract)) (define integer-multiply (integer-op multiply-carefully bignum-multiply)) (define integer-quotient (integer-op quotient-carefully bignum-quotient)) (define integer-remainder (integer-op remainder-carefully bignum-remainder)) (define (integer-abs x) (if (fixnum? x) (abs-carefully x (lambda (r) r) bignum-abs) (bignum-abs x))) ; What about shifts and bitwise operations? ; Fixnums and bignums are disjoint. (define (integer= x y) (cond ((and (fixnum? x) (fixnum? y)) (fixnum= x y)) ((and (bignum? x) (bignum? y)) (bignum= x y)) (else #f))) ; Positive bignums are greater than all fixnums, negative bignums are less ; than all fixnums. (define (integer< x y) (cond ((fixnum? x) (if (fixnum? y) (fixnum< x y) (bignum-positive? y))) ((fixnum? y) (not (bignum-positive? y))) (else (bignum< x y)))) (define (integer<= x y) (not (integer< y x))) (define (integer> x y) (integer< y x)) (define (integer>= x y) (not (integer< x y)))