On 22-Aug-05, at 5:22 PM, Bradley Lucier wrote:
Marc:
You should specialize equal?, eqv?, and = to eq? when one of the arguments is a fixnum constant.
Brad _______________________________________________ Gambit-list mailing list Gambit-list@iro.umontreal.ca http://mailman.iro.umontreal.ca/mailman/listinfo/gambit-list
For quite some time the specialisation from eqv? to eq? on eq?- testable constants (such as symbols, 32 bit fixnums, characters, #t, #f, etc) is performed by the compiler. I have extended this to equal?.
For example, the following code
(declare (standard-bindings)) (define (f1 x) (if (equal? x 1000000) 'foo 'bar)) (define (f2 x) (if (equal? x 1000000000000000000000) 'foo 'bar))
now expands to
(define f1 (lambda (x) (if ('#<procedure #2 ##eq?> x 1000000) 'foo 'bar))) (define f2 (lambda (x) (if (equal? x 1000000000000000000000) 'foo 'bar)))
So in compiled code, (equal? x '()) is as fast as (null? x)
Unfortunately the specialization of = to eq? on 32 bit fixnums does not work, because
(= x 0) != (eq? x 0)
when x is 0.0 .
Marc