Implement R6RS' `fixnum?' in a smarter way
authorAndreas Rottmann <a.rottmann@gmx.at>
Fri, 8 Apr 2011 21:56:30 +0000 (23:56 +0200)
committerAndreas Rottmann <a.rottmann@gmx.at>
Fri, 8 Apr 2011 21:56:30 +0000 (23:56 +0200)
* module/rnrs/arithmetic/fixnums.scm (fixnum?): Implemented using
  bit-twiddling, and using `define-inlinable'.

module/rnrs/arithmetic/fixnums.scm

index 03511ed..0ce2458 100644 (file)
@@ -76,6 +76,7 @@
          fxreverse-bit-field)
   (import (only (guile) ash
                        cons*
+                       define-inlinable
                        inexact->exact
                        logand
                        logbit?
@@ -84,7 +85,8 @@
                        lognot
                        logxor
                        most-positive-fixnum 
-                       most-negative-fixnum)
+                       most-negative-fixnum
+                       object-address)
          (ice-9 optargs)
          (rnrs base (6))
          (rnrs control (6))
 
   (define (greatest-fixnum) most-positive-fixnum)
   (define (least-fixnum) most-negative-fixnum)
-  
-  (define (fixnum? obj) 
-    (and (integer? obj) 
-        (exact? obj) 
-        (>= obj most-negative-fixnum) 
-        (<= obj most-positive-fixnum)))
+
+  (define-inlinable (fixnum? obj)
+    (not (= 0 (logand 2 (object-address obj)))))
 
   (define-syntax assert-fixnum
     (syntax-rules ()