[R6RS] Draft of arithmetic SRFI

William D Clinger will
Wed Aug 3 13:50:43 EDT 2005


Mike Sperber wrote:
> > One of the main rationales for the fixnum primitives is as a basis
> > for implementing the full numeric tower.  When implementing bignums,
> > I think it's easier to deal with arithmetic modulo hi-lo+1 than to
> > have to guard against overflow exceptions.
> 
> I actually don't think that's true.  At least the reference
> implementation takes great care never to wrap.  One place where it
> really hurts is with generic arithmetic: When adding two fixnums, I
> basically have to always convert to bignums and then coerce back if I
> don't have an overflow signal---that's expensive.

Your code for integer addition basically looks like this:

(define (integer+ a b)
  (bignum+ (integer->bignum a)
           (integer->bignum b)))

That code can be bummed as follows:

(define (integer+ a b)
  (if (and (fixnum? a) (fixnum? b))
      (let ((c (fx+ a b)))
        (cond ((not (negative? a))
               (if (fx<= b c)
                   c
                   (bignum+ (integer->bignum a) (integer->bignum b))))
              ((negative? a)
               (if (fx< c b)
                   c
                   (bignum+ (integer->bignum a) (integer->bignum c))))
              (else c)))
      (bignum+ (integer->bignum a) (integer->bignum b))))

The bummed code would not work if fx+ were to signal an error on
overflow.  With the error-signalling semantics, it would be hard
to do better than your original code, which I think is just too
slow.

Matthew Flatt wrote:
> I'd prefer that all "unspecified"s be resolved.

I hope you were talking only about the record SRFI, Matthew, and
were not stating a general philosophy that you'd like to apply to
the entire R6RS.  If you were stating a general philosophy, then
I need to explain a few facts of life.

Will


More information about the R6RS mailing list