guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 20/30: Add &exact-number helper definition


From: Andy Wingo
Subject: [Guile-commits] 20/30: Add &exact-number helper definition
Date: Fri, 24 Nov 2017 09:24:22 -0500 (EST)

wingo pushed a commit to branch master
in repository guile.

commit 6a11fb15325028373c1a6ab334778ee5d3d8a318
Author: Andy Wingo <address@hidden>
Date:   Wed Nov 22 15:33:13 2017 +0100

    Add &exact-number helper definition
    
    * module/language/cps/types.scm (&exact-number): New union type.
      (rational?, exact?):
    * module/language/cps/type-fold.scm (mul/immediate): Use the new
      definition.
---
 module/language/cps/type-fold.scm |  3 +--
 module/language/cps/types.scm     | 12 +++++++-----
 2 files changed, 8 insertions(+), 7 deletions(-)

diff --git a/module/language/cps/type-fold.scm 
b/module/language/cps/type-fold.scm
index 4fbd5c2..5315e3e 100644
--- a/module/language/cps/type-fold.scm
+++ b/module/language/cps/type-fold.scm
@@ -281,8 +281,7 @@
       ($ (with-cps-constants ((zero 0))
            (build-term
              ($continue k src ($primcall 'sub #f (zero arg))))))))
-   ((and (eqv? constant 0)
-         (type<=? type (logior &exact-integer &fraction)))
+   ((and (eqv? constant 0) (type<=? type &exact-number))
     ;; (* arg 0) -> 0 if arg is exact
     (with-cps cps
       (build-term ($continue k src ($const 0)))))
diff --git a/module/language/cps/types.scm b/module/language/cps/types.scm
index 63ee1ce..809b0ec 100644
--- a/module/language/cps/types.scm
+++ b/module/language/cps/types.scm
@@ -115,7 +115,7 @@
             &null &nil &false &true &unspecified &undefined &eof
 
             ;; Union types.
-            &exact-integer &number &real
+            &exact-integer &exact-number &real &number
 
             ;; Untagged types.
             &f64
@@ -189,10 +189,12 @@
 
 (define-syntax &exact-integer
   (identifier-syntax (logior &fixnum &bignum)))
-(define-syntax &number
-  (identifier-syntax (logior &fixnum &bignum &flonum &complex &fraction)))
+(define-syntax &exact-number
+  (identifier-syntax (logior &fixnum &bignum &fraction)))
 (define-syntax &real
   (identifier-syntax (logior &fixnum &bignum &flonum &fraction)))
+(define-syntax &number
+  (identifier-syntax (logior &fixnum &bignum &flonum &complex &fraction)))
 
 (define-syntax-rule (type<=? x type)
   (zero? (logand x (lognot type))))
@@ -1348,7 +1350,7 @@ minimum, and maximum."
     (define-type-predicate-result val result type)))
 (define-simple-type-predicate-inferrer complex? &number)
 (define-simple-type-predicate-inferrer real? &real)
-(define-simple-type-predicate-inferrer rational? (logior &exact-integer 
&fraction))
+(define-simple-type-predicate-inferrer rational? &exact-number)
 ;; FIXME: If it's a flonum it may be an integer, but if it's not an
 ;; integer it also may be still be a flonum.
 ;; (define-simple-type-predicate-inferrer integer? (logior &exact-integer 
&flonum))
@@ -1356,7 +1358,7 @@ minimum, and maximum."
 (define-simple-type-checker (exact? &number))
 (define-type-inferrer (exact? val result)
   (restrict! val &number -inf.0 +inf.0)
-  (define-type-predicate-result val result (logior &exact-integer &fraction)))
+  (define-type-predicate-result val result &exact-number))
 
 (define-simple-type-checker (inexact? &number))
 (define-type-inferrer (inexact? val result)



reply via email to

[Prev in Thread] Current Thread [Next in Thread]