Delay evaluation of numeric base env types.

This commit is contained in:
Vincent St-Amour 2011-08-30 14:18:49 -04:00
parent f3d22879a2
commit 70aaf6bf24

View File

@ -78,6 +78,7 @@
(define round-type ; also used for truncate (define round-type ; also used for truncate
(lambda ()
(from-cases (from-cases
(map unop all-int-types) (map unop all-int-types)
(-> -NonNegRat -Nat) (-> -NonNegRat -Nat)
@ -89,12 +90,13 @@
-NonNegSingleFlonum -NonPosSingleFlonum -SingleFlonum -NonNegSingleFlonum -NonPosSingleFlonum -SingleFlonum
-InexactRealPosZero -InexactRealNegZero -InexactRealZero -InexactRealPosZero -InexactRealNegZero -InexactRealZero
-NonNegInexactReal -NonPosInexactReal -InexactReal -NonNegInexactReal -NonPosInexactReal -InexactReal
-RealZero -NonNegReal -NonPosReal -Real)))) -RealZero -NonNegReal -NonPosReal -Real)))))
(define fl-unop (unop -Flonum)) (define fl-unop (lambda () (unop -Flonum)))
;; types for specific operations, to avoid repetition between safe and unsafe versions ;; types for specific operations, to avoid repetition between safe and unsafe versions
(define fx+-type (define fx+-type
(lambda ()
(fx-from-cases (fx-from-cases
(binop -Zero) (binop -Zero)
(map (lambda (t) (commutative-binop t -Zero t)) (map (lambda (t) (commutative-binop t -Zero t))
@ -107,8 +109,9 @@
(commutative-binop -NegInt -One -NonPosFixnum) (commutative-binop -NegInt -One -NonPosFixnum)
(commutative-binop -NegInt -NonPosInt -NegFixnum) (commutative-binop -NegInt -NonPosInt -NegFixnum)
(-NonPosInt -NonPosInt . -> . -NonPosFixnum) (-NonPosInt -NonPosInt . -> . -NonPosFixnum)
(-Int -Int . -> . -Fixnum))) (-Int -Int . -> . -Fixnum))))
(define fx--type (define fx--type
(lambda ()
(fx-from-cases (fx-from-cases
(binop -Zero) (binop -Zero)
(map (lambda (t) (commutative-binop t -Zero t)) (map (lambda (t) (commutative-binop t -Zero t))
@ -123,8 +126,9 @@
(-PosInt -NonPosInt . -> . -PosInt) (-PosInt -NonPosInt . -> . -PosInt)
(-Nat -NegInt . -> . -PosInt) (-Nat -NegInt . -> . -PosInt)
(-Nat -NonPosInt . -> . -Nat) (-Nat -NonPosInt . -> . -Nat)
(-Int -Int . -> . -Fixnum))) (-Int -Int . -> . -Fixnum))))
(define fx*-type (define fx*-type
(lambda ()
(fx-from-cases (fx-from-cases
(map binop (list -Zero -One)) (map binop (list -Zero -One))
(commutative-binop -Zero -Int) (commutative-binop -Zero -Int)
@ -136,8 +140,9 @@
(-Nat -Nat . -> . -NonNegFixnum) (-Nat -Nat . -> . -NonNegFixnum)
(commutative-binop -Nat -NonPosInt -NonPosFixnum) (commutative-binop -Nat -NonPosInt -NonPosFixnum)
(-NonPosFixnum -NonPosFixnum . -> . -NonNegFixnum) (-NonPosFixnum -NonPosFixnum . -> . -NonNegFixnum)
(-Int -Int . -> . -Fixnum))) (-Int -Int . -> . -Fixnum))))
(define fxquotient-type (define fxquotient-type
(lambda ()
(fx-from-cases (fx-from-cases
(-Zero -Int . -> . -Zero) (-Zero -Int . -> . -Zero)
(map (lambda (t) (-> t -One t)) ; division by one is identity (map (lambda (t) (-> t -One t)) ; division by one is identity
@ -148,8 +153,9 @@
(-Nat -Nat . -> . -NonNegFixnum) (-Nat -Nat . -> . -NonNegFixnum)
(commutative-binop -Nat -NonPosInt -NonPosFixnum) (commutative-binop -Nat -NonPosInt -NonPosFixnum)
(-NonPosInt -NonPosInt . -> . -NonNegFixnum) (-NonPosInt -NonPosInt . -> . -NonNegFixnum)
(-Int -Int . -> . -Fixnum))) (-Int -Int . -> . -Fixnum))))
(define fxremainder-type ; result has same sign as first arg (define fxremainder-type ; result has same sign as first arg
(lambda ()
(fx-from-cases (fx-from-cases
(-One -One . -> . -Zero) (-One -One . -> . -Zero)
(map (lambda (t) (list (-> -Nat t t) (map (lambda (t) (list (-> -Nat t t)
@ -157,8 +163,9 @@
(list -Byte -Index)) (list -Byte -Index))
(-Nat -Int . -> . -NonNegFixnum) (-Nat -Int . -> . -NonNegFixnum)
(-NonPosInt -Int . -> . -NonPosFixnum) (-NonPosInt -Int . -> . -NonPosFixnum)
(-Int -Int . -> . -Fixnum))) (-Int -Int . -> . -Fixnum))))
(define fxmodulo-type ; result has same sign as second arg (define fxmodulo-type ; result has same sign as second arg
(lambda ()
(fx-from-cases (fx-from-cases
(-One -One . -> . -Zero) (-One -One . -> . -Zero)
(map (lambda (t) (list (-> -Int t t) (map (lambda (t) (list (-> -Int t t)
@ -166,13 +173,15 @@
(list -Byte -Index)) (list -Byte -Index))
(-Int -Nat . -> . -NonNegFixnum) (-Int -Nat . -> . -NonNegFixnum)
(-Int -NonPosInt . -> . -NonPosFixnum) (-Int -NonPosInt . -> . -NonPosFixnum)
(-Int -Int . -> . -Fixnum))) (-Int -Int . -> . -Fixnum))))
(define fxabs-type (define fxabs-type
(lambda ()
(fx-from-cases (fx-from-cases
(map unop (list -Zero -One -PosByte -Byte -PosIndex -Index)) (map unop (list -Zero -One -PosByte -Byte -PosIndex -Index))
((Un -PosInt -NegInt) . -> . -PosFixnum) ((Un -PosInt -NegInt) . -> . -PosFixnum)
(-Int . -> . -NonNegFixnum))) (-Int . -> . -NonNegFixnum))))
(define fx=-type (define fx=-type
(lambda ()
(fx-from-cases (fx-from-cases
;; we could rule out cases like (= Pos Neg), but we currently don't ;; we could rule out cases like (= Pos Neg), but we currently don't
(map (lambda (l) (apply exclude-zero l)) (map (lambda (l) (apply exclude-zero l))
@ -183,8 +192,9 @@
(list -Int (Un -PosFixnum -NegFixnum)))) (list -Int (Un -PosFixnum -NegFixnum))))
(map (lambda (t) (commutative-equality/filter -Int t)) (map (lambda (t) (commutative-equality/filter -Int t))
(list -One -PosByte -Byte -PosIndex -Index -PosFixnum -NonNegFixnum -NegFixnum -NonPosFixnum)) (list -One -PosByte -Byte -PosIndex -Index -PosFixnum -NonNegFixnum -NegFixnum -NonPosFixnum))
(comp -Int))) (comp -Int))))
(define fx<-type (define fx<-type
(lambda ()
(fx-from-cases (fx-from-cases
(-> -Pos -One B : (-FS (-filter (Un) 0) -top)) ; can't happen (-> -Pos -One B : (-FS (-filter (Un) 0) -top)) ; can't happen
(-> -Nat -One B : (-FS (-filter -Zero 0) -top)) (-> -Nat -One B : (-FS (-filter -Zero 0) -top))
@ -219,8 +229,9 @@
(-> -Int -NonPosInt B : (-FS (-filter -NegFixnum 0) -top)) (-> -Int -NonPosInt B : (-FS (-filter -NegFixnum 0) -top))
(-> -NegInt -Int B : (-FS -top (-filter -NegFixnum 1))) (-> -NegInt -Int B : (-FS -top (-filter -NegFixnum 1)))
(-> -NonPosInt -Int B : (-FS -top (-filter -NonPosFixnum 1))) (-> -NonPosInt -Int B : (-FS -top (-filter -NonPosFixnum 1)))
(comp -Int))) (comp -Int))))
(define fx>-type (define fx>-type
(lambda ()
(fx-from-cases (fx-from-cases
(-> -One -Pos B : (-FS (-filter (Un) 1) -top)) ; can't happen (-> -One -Pos B : (-FS (-filter (Un) 1) -top)) ; can't happen
(-> -One -Nat B : (-FS (-filter -Zero 1) -top)) (-> -One -Nat B : (-FS (-filter -Zero 1) -top))
@ -252,8 +263,9 @@
(-> -NonPosInt -Int B : (-FS (-filter -NegFixnum 1) -top)) (-> -NonPosInt -Int B : (-FS (-filter -NegFixnum 1) -top))
(-> -Int -NegInt B : (-FS -top (-filter -NegFixnum 0))) (-> -Int -NegInt B : (-FS -top (-filter -NegFixnum 0)))
(-> -Int -NonPosInt B : (-FS -top (-filter -NonPosFixnum 0))) (-> -Int -NonPosInt B : (-FS -top (-filter -NonPosFixnum 0)))
(comp -Int))) (comp -Int))))
(define fx<=-type (define fx<=-type
(lambda ()
(fx-from-cases (fx-from-cases
(-> -Pos -One B : (-FS (-filter -One 0) -top)) (-> -Pos -One B : (-FS (-filter -One 0) -top))
(-> -Byte -Zero B : (-FS (-filter -Zero 0) (-filter -PosByte 0))) (-> -Byte -Zero B : (-FS (-filter -Zero 0) (-filter -PosByte 0)))
@ -285,8 +297,9 @@
(-> -Int -NegInt B : (-FS (-filter -NegFixnum 0) -top)) (-> -Int -NegInt B : (-FS (-filter -NegFixnum 0) -top))
(-> -Int -NonPosInt B : (-FS (-filter -NonPosFixnum 0) -top)) (-> -Int -NonPosInt B : (-FS (-filter -NonPosFixnum 0) -top))
(-> -NonPosInt -Int B : (-FS -top (-filter -NegFixnum 1))) (-> -NonPosInt -Int B : (-FS -top (-filter -NegFixnum 1)))
(comp -Int))) (comp -Int))))
(define fx>=-type (define fx>=-type
(lambda ()
(fx-from-cases (fx-from-cases
(-> -One -Pos B : (-FS (-filter -One 1) -top)) (-> -One -Pos B : (-FS (-filter -One 1) -top))
(-> -Zero -Byte B : (-FS (-filter -Zero 1) (-filter -PosByte 1))) (-> -Zero -Byte B : (-FS (-filter -Zero 1) (-filter -PosByte 1)))
@ -318,8 +331,9 @@
(-> -NegInt -Int B : (-FS (-filter -NegFixnum 1) -top)) (-> -NegInt -Int B : (-FS (-filter -NegFixnum 1) -top))
(-> -NonPosInt -Int B : (-FS (-filter -NonPosFixnum 1) -top)) (-> -NonPosInt -Int B : (-FS (-filter -NonPosFixnum 1) -top))
(-> -Int -NonPosInt B : (-FS -top (-filter -NegFixnum 0))) (-> -Int -NonPosInt B : (-FS -top (-filter -NegFixnum 0)))
(comp -Int))) (comp -Int))))
(define fxmin-type (define fxmin-type
(lambda ()
(fx-from-cases (fx-from-cases
(binop -Zero) (binop -Zero)
(binop -One) (binop -One)
@ -332,8 +346,9 @@
(-> -Nat -Nat -NonNegFixnum) (-> -Nat -Nat -NonNegFixnum)
(commutative-binop -NegInt -Int -NegFixnum) (commutative-binop -NegInt -Int -NegFixnum)
(commutative-binop -NonPosInt -Int -NonPosInt) (commutative-binop -NonPosInt -Int -NonPosInt)
(-> -Int -Int -Fixnum))) (-> -Int -Int -Fixnum))))
(define fxmax-type (define fxmax-type
(lambda ()
(fx-from-cases (fx-from-cases
(binop -Zero) (binop -Zero)
(commutative-binop -One (Un -Zero -One) -One) (commutative-binop -One (Un -Zero -One) -One)
@ -343,8 +358,9 @@
(map binop (list -Index -NegFixnum -NonPosFixnum)) (map binop (list -Index -NegFixnum -NonPosFixnum))
(commutative-binop -PosInt -Int -PosFixnum) (commutative-binop -PosInt -Int -PosFixnum)
(commutative-binop -Nat -Int -NonNegFixnum) (commutative-binop -Nat -Int -NonNegFixnum)
(-> -Int -Int -Fixnum))) (-> -Int -Int -Fixnum))))
(define fxand-type (define fxand-type
(lambda ()
(fx-from-cases (fx-from-cases
(commutative-binop -Zero -Int -Zero) (commutative-binop -Zero -Int -Zero)
(commutative-binop -Byte -Int -Byte) (commutative-binop -Byte -Int -Byte)
@ -352,8 +368,9 @@
(binop -Nat -NonNegFixnum) (binop -Nat -NonNegFixnum)
(binop -NegInt -NegFixnum) (binop -NegInt -NegFixnum)
(binop -NonPosInt -NonPosFixnum) (binop -NonPosInt -NonPosFixnum)
(binop -Int -Fixnum))) (binop -Int -Fixnum))))
(define fxior-type (define fxior-type
(lambda ()
(fx-from-cases (fx-from-cases
(binop -Zero) (binop -Zero)
(commutative-binop -One -Zero -One) (commutative-binop -One -Zero -One)
@ -364,8 +381,9 @@
(commutative-binop -PosInt -Nat -PosFixnum) (commutative-binop -PosInt -Nat -PosFixnum)
(binop -Nat -NonNegFixnum) (binop -Nat -NonNegFixnum)
(commutative-binop -NegInt -Int -NegFixnum) ; as long as there's one negative, the result is negative (commutative-binop -NegInt -Int -NegFixnum) ; as long as there's one negative, the result is negative
(binop -Int -Fixnum))) (binop -Int -Fixnum))))
(define fxxor-type (define fxxor-type
(lambda ()
(fx-from-cases (fx-from-cases
(binop -Zero) (binop -Zero)
(binop -One -Zero) (binop -One -Zero)
@ -375,13 +393,15 @@
(binop -NonPosInt -NonNegFixnum) (binop -NonPosInt -NonNegFixnum)
(commutative-binop -NegInt -Nat -NegFixnum) (commutative-binop -NegInt -Nat -NegFixnum)
(commutative-binop -NonPosInt -Nat -NonPosFixnum) (commutative-binop -NonPosInt -Nat -NonPosFixnum)
(binop -Int -Fixnum))) (binop -Int -Fixnum))))
(define fxnot-type (define fxnot-type
(lambda ()
(fx-from-cases (fx-from-cases
(-Nat . -> . -NegFixnum) (-Nat . -> . -NegFixnum)
(-NegInt . -> . -NonNegFixnum) (-NegInt . -> . -NonNegFixnum)
(-Int . -> . -Fixnum))) (-Int . -> . -Fixnum))))
(define fxlshift-type (define fxlshift-type
(lambda ()
(fx-from-cases (fx-from-cases
(map (lambda (x) (-> x -Zero x)) (map (lambda (x) (-> x -Zero x))
(list -Zero -One -PosByte -Byte -PosIndex -Index)) (list -Zero -One -PosByte -Byte -PosIndex -Index))
@ -389,32 +409,38 @@
(-> -Nat -Int -NonNegFixnum) (-> -Nat -Int -NonNegFixnum)
(-> -NegInt -Int -NegFixnum) (-> -NegInt -Int -NegFixnum)
(-> -NonPosInt -Int -NonPosFixnum) (-> -NonPosInt -Int -NonPosFixnum)
(binop -Int -Fixnum))) (binop -Int -Fixnum))))
(define fxrshift-type (define fxrshift-type
(lambda ()
(fx-from-cases (fx-from-cases
(map (lambda (x) (-> x -Zero x)) (map (lambda (x) (-> x -Zero x))
(list -Zero -One -PosByte -Byte -PosIndex -Index)) (list -Zero -One -PosByte -Byte -PosIndex -Index))
(-> -Nat -Int -NonNegFixnum) ; can reach 0 (-> -Nat -Int -NonNegFixnum) ; can reach 0
(-> -NegInt -Int -NegFixnum) ; can't reach 0 (-> -NegInt -Int -NegFixnum) ; can't reach 0
(-> -NonPosInt -Int -NonPosFixnum) (-> -NonPosInt -Int -NonPosFixnum)
(binop -Int -Fixnum))) (binop -Int -Fixnum))))
(define flabs-type (cl->* (-> (Un -PosFlonum -NegFlonum) -PosFlonum) (define flabs-type
(-> -Flonum -NonNegFlonum))) (lambda ()
(cl->* (-> (Un -PosFlonum -NegFlonum) -PosFlonum)
(-> -Flonum -NonNegFlonum))))
(define fl+-type (define fl+-type
(lambda ()
(from-cases (map (lambda (t) (commutative-binop t -FlonumZero t)) (from-cases (map (lambda (t) (commutative-binop t -FlonumZero t))
all-flonum-types) all-flonum-types)
(commutative-binop -NonNegFlonum -PosFlonum -PosFlonum) (commutative-binop -NonNegFlonum -PosFlonum -PosFlonum)
(map binop (list -NonNegFlonum -NegFlonum -NonPosFlonum -Flonum)) (map binop (list -NonNegFlonum -NegFlonum -NonPosFlonum -Flonum))
(-Flonum -Flonum . -> . -Flonum))) (-Flonum -Flonum . -> . -Flonum))))
(define fl--type (define fl--type
(lambda ()
(from-cases (binop -FlonumZero) (from-cases (binop -FlonumZero)
(-NegFlonum (Un -NonNegFlonum -FlonumZero) . -> . -NegFlonum) (-NegFlonum (Un -NonNegFlonum -FlonumZero) . -> . -NegFlonum)
((Un -NonPosFlonum -FlonumZero) -PosFlonum . -> . -NegFlonum) ((Un -NonPosFlonum -FlonumZero) -PosFlonum . -> . -NegFlonum)
(-NonPosFlonum -NonNegFlonum . -> . -NonPosFlonum) (-NonPosFlonum -NonNegFlonum . -> . -NonPosFlonum)
(binop -Flonum))) (binop -Flonum))))
(define fl*-type (define fl*-type
(lambda ()
(from-cases (map binop (list -FlonumPosZero -FlonumNegZero)) (from-cases (map binop (list -FlonumPosZero -FlonumNegZero))
(commutative-binop -FlonumNegZero -FlonumPosZero -FlonumNegZero) (commutative-binop -FlonumNegZero -FlonumPosZero -FlonumNegZero)
(binop -FlonumNegZero -FlonumPosZero) (binop -FlonumNegZero -FlonumPosZero)
@ -424,8 +450,9 @@
(binop -NegFlonum -NonNegFlonum) (binop -NegFlonum -NonNegFlonum)
(commutative-binop -NonPosFlonum -NonNegFlonum -NonPosFlonum) (commutative-binop -NonPosFlonum -NonNegFlonum -NonPosFlonum)
(binop -NonPosFlonum -NonNegFlonum) (binop -NonPosFlonum -NonNegFlonum)
(binop -Flonum))) (binop -Flonum))))
(define fl/-type (define fl/-type
(lambda ()
(from-cases (-FlonumPosZero -PosFlonum . -> . -FlonumPosZero) (from-cases (-FlonumPosZero -PosFlonum . -> . -FlonumPosZero)
(-FlonumPosZero -NegFlonum . -> . -FlonumNegZero) (-FlonumPosZero -NegFlonum . -> . -FlonumNegZero)
(-FlonumNegZero -PosFlonum . -> . -FlonumNegZero) (-FlonumNegZero -PosFlonum . -> . -FlonumNegZero)
@ -433,16 +460,18 @@
(-PosFlonum -PosFlonum . -> . -NonNegFlonum) ; possible underflow (-PosFlonum -PosFlonum . -> . -NonNegFlonum) ; possible underflow
(commutative-binop -PosFlonum -NegFlonum -NonPosFlonum) (commutative-binop -PosFlonum -NegFlonum -NonPosFlonum)
(-NegFlonum -NegFlonum . -> . -NonNegFlonum) (-NegFlonum -NegFlonum . -> . -NonNegFlonum)
(binop -Flonum))) (binop -Flonum))))
(define fl=-type (define fl=-type
(lambda ()
(from-cases (map (lambda (l) (exclude-zero (car l) (cadr l) -FlonumZero)) (from-cases (map (lambda (l) (exclude-zero (car l) (cadr l) -FlonumZero))
(list (list -NonNegFlonum -PosFlonum) (list (list -NonNegFlonum -PosFlonum)
(list -NonPosFlonum -NegFlonum))) (list -NonPosFlonum -NegFlonum)))
(map (lambda (t) (commutative-equality/filter -Flonum t)) (map (lambda (t) (commutative-equality/filter -Flonum t))
(list -FlonumZero -PosFlonum -NonNegFlonum (list -FlonumZero -PosFlonum -NonNegFlonum
-NegFlonum -NonPosFlonum)) -NegFlonum -NonPosFlonum))
(comp -Flonum))) (comp -Flonum))))
(define fl<-type (define fl<-type
(lambda ()
(from-cases (from-cases
(-> -FlonumZero -Flonum B : (-FS (-filter -PosFlonum 1) (-filter (Un -NonPosFlonum -FlonumPosZero) 1))) (-> -FlonumZero -Flonum B : (-FS (-filter -PosFlonum 1) (-filter (Un -NonPosFlonum -FlonumPosZero) 1)))
(-> -Flonum -FlonumZero B : (-FS (-filter -NegFlonum 0) (-filter (Un -NonNegFlonum -FlonumNegZero) 0))) (-> -Flonum -FlonumZero B : (-FS (-filter -NegFlonum 0) (-filter (Un -NonNegFlonum -FlonumNegZero) 0)))
@ -454,8 +483,9 @@
(-> -Flonum -NegFlonum B : (-FS (-filter -NegFlonum 0) -top)) (-> -Flonum -NegFlonum B : (-FS (-filter -NegFlonum 0) -top))
(-> -NonPosFlonum -Flonum B : (-FS -top (-filter (Un -NonPosFlonum -FlonumPosZero) 1))) (-> -NonPosFlonum -Flonum B : (-FS -top (-filter (Un -NonPosFlonum -FlonumPosZero) 1)))
(-> -Flonum -NonPosFlonum B : (-FS (-filter -NegFlonum 0) -top)) (-> -Flonum -NonPosFlonum B : (-FS (-filter -NegFlonum 0) -top))
(comp -Flonum))) (comp -Flonum))))
(define fl>-type (define fl>-type
(lambda ()
(from-cases (from-cases
(-> -FlonumZero -Flonum B : (-FS (-filter -NegFlonum 1) (-filter (Un -NonNegFlonum -FlonumNegZero) 1))) (-> -FlonumZero -Flonum B : (-FS (-filter -NegFlonum 1) (-filter (Un -NonNegFlonum -FlonumNegZero) 1)))
(-> -Flonum -FlonumZero B : (-FS (-filter -PosFlonum 0) (-filter (Un -NonPosFlonum -FlonumPosZero) 0))) (-> -Flonum -FlonumZero B : (-FS (-filter -PosFlonum 0) (-filter (Un -NonPosFlonum -FlonumPosZero) 0)))
@ -467,8 +497,9 @@
(-> -Flonum -NegFlonum B : (-FS -top (-filter -NegFlonum 0))) (-> -Flonum -NegFlonum B : (-FS -top (-filter -NegFlonum 0)))
(-> -NonPosFlonum -Flonum B : (-FS (-filter -NegFlonum 1) -top)) (-> -NonPosFlonum -Flonum B : (-FS (-filter -NegFlonum 1) -top))
(-> -Flonum -NonPosFlonum B : (-FS -top (-filter (Un -NonPosFlonum -FlonumPosZero) 0))) (-> -Flonum -NonPosFlonum B : (-FS -top (-filter (Un -NonPosFlonum -FlonumPosZero) 0)))
(comp -Flonum))) (comp -Flonum))))
(define fl<=-type (define fl<=-type
(lambda ()
(from-cases (from-cases
(-> -FlonumZero -Flonum B : (-FS (-filter (Un -NonNegFlonum -FlonumNegZero) 1) (-filter -NegFlonum 1))) (-> -FlonumZero -Flonum B : (-FS (-filter (Un -NonNegFlonum -FlonumNegZero) 1) (-filter -NegFlonum 1)))
(-> -Flonum -FlonumZero B : (-FS (-filter (Un -NonPosFlonum -FlonumPosZero) 0) (-filter -PosFlonum 0))) (-> -Flonum -FlonumZero B : (-FS (-filter (Un -NonPosFlonum -FlonumPosZero) 0) (-filter -PosFlonum 0)))
@ -480,8 +511,9 @@
(-> -Flonum -NegFlonum B : (-FS (-filter -NegFlonum 0) -top)) (-> -Flonum -NegFlonum B : (-FS (-filter -NegFlonum 0) -top))
(-> -NonPosFlonum -Flonum B : (-FS -top (-filter -NegFlonum 1))) (-> -NonPosFlonum -Flonum B : (-FS -top (-filter -NegFlonum 1)))
(-> -Flonum -NonPosFlonum B : (-FS (-filter (Un -NonPosFlonum -FlonumPosZero) 0) -top)) (-> -Flonum -NonPosFlonum B : (-FS (-filter (Un -NonPosFlonum -FlonumPosZero) 0) -top))
(comp -Flonum))) (comp -Flonum))))
(define fl>=-type (define fl>=-type
(lambda ()
(from-cases (from-cases
(-> -FlonumZero -Flonum B : (-FS (-filter (Un -NonPosFlonum -FlonumPosZero) 1) (-filter -PosFlonum 1))) (-> -FlonumZero -Flonum B : (-FS (-filter (Un -NonPosFlonum -FlonumPosZero) 1) (-filter -PosFlonum 1)))
(-> -Flonum -FlonumZero B : (-FS (-filter (Un -NonNegFlonum -FlonumNegZero) 0) (-filter -NegFlonum 0))) (-> -Flonum -FlonumZero B : (-FS (-filter (Un -NonNegFlonum -FlonumNegZero) 0) (-filter -NegFlonum 0)))
@ -493,46 +525,56 @@
(-> -Flonum -NegFlonum B : (-FS -top (-filter -NegFlonum 0))) (-> -Flonum -NegFlonum B : (-FS -top (-filter -NegFlonum 0)))
(-> -NonPosFlonum -Flonum B : (-FS -top (-filter -PosFlonum 1))) (-> -NonPosFlonum -Flonum B : (-FS -top (-filter -PosFlonum 1)))
(-> -Flonum -NonPosFlonum B : (-FS (-filter (Un -NonPosFlonum -FlonumPosZero) 0) -top)) (-> -Flonum -NonPosFlonum B : (-FS (-filter (Un -NonPosFlonum -FlonumPosZero) 0) -top))
(comp -Flonum))) (comp -Flonum))))
(define flmin-type (define flmin-type
(lambda ()
(from-cases (map binop (from-cases (map binop
(list -PosFlonum -NonNegFlonum -NegFlonum -NonPosFlonum -Flonum)))) (list -PosFlonum -NonNegFlonum -NegFlonum -NonPosFlonum -Flonum)))))
(define flmax-type (define flmax-type
(lambda ()
(from-cases (commutative-case -PosFlonum -Flonum -PosFlonum) (from-cases (commutative-case -PosFlonum -Flonum -PosFlonum)
(commutative-case -NonNegFlonum -Flonum -NonNegFlonum) (commutative-case -NonNegFlonum -Flonum -NonNegFlonum)
(binop -NegFlonum) (binop -NegFlonum)
(commutative-case -NegFlonum -NonPosFlonum -NonPosFlonum) (commutative-case -NegFlonum -NonPosFlonum -NonPosFlonum)
(binop -Flonum))) (binop -Flonum))))
(define flround-type ; truncate too (define flround-type ; truncate too
(lambda ()
(from-cases (map unop (list -FlonumPosZero -FlonumNegZero -FlonumZero (from-cases (map unop (list -FlonumPosZero -FlonumNegZero -FlonumZero
-NonNegFlonum -NonPosFlonum -Flonum)))) -NonNegFlonum -NonPosFlonum -Flonum)))))
(define flfloor-type (define flfloor-type
(lambda ()
(from-cases (map unop (list -FlonumPosZero -FlonumNegZero -FlonumZero (from-cases (map unop (list -FlonumPosZero -FlonumNegZero -FlonumZero
-NonNegFlonum -NegFlonum -NonPosFlonum -Flonum)))) -NonNegFlonum -NegFlonum -NonPosFlonum -Flonum)))))
(define flceiling-type (define flceiling-type
(lambda ()
(from-cases (map unop (list -FlonumPosZero -FlonumNegZero -FlonumZero (from-cases (map unop (list -FlonumPosZero -FlonumNegZero -FlonumZero
-PosFlonum -NonNegFlonum -NonPosFlonum -Flonum)))) -PosFlonum -NonNegFlonum -NonPosFlonum -Flonum)))))
(define fllog-type (define fllog-type
(lambda ()
(from-cases (-> -FlonumZero -NegFlonum) ; -inf (from-cases (-> -FlonumZero -NegFlonum) ; -inf
(-> -PosFlonum -NonNegFlonum) ; possible underflow (-> -PosFlonum -NonNegFlonum) ; possible underflow
(unop -Flonum))) (unop -Flonum))))
(define flexp-type (define flexp-type
(lambda ()
(from-cases ((Un -NonNegFlonum -FlonumNegZero) . -> . -PosFlonum) (from-cases ((Un -NonNegFlonum -FlonumNegZero) . -> . -PosFlonum)
(-NegFlonum . -> . -NonNegFlonum) (-NegFlonum . -> . -NonNegFlonum)
(-Flonum . -> . -Flonum))) ; nan is the only non nonnegative case (returns nan) (-Flonum . -> . -Flonum)))) ; nan is the only non nonnegative case (returns nan)
(define flsqrt-type (define flsqrt-type
(lambda ()
(from-cases (map unop (list -FlonumPosZero -FlonumNegZero -FlonumZero (from-cases (map unop (list -FlonumPosZero -FlonumNegZero -FlonumZero
-NonNegFlonum ; we don't have positive case, possible underflow -NonNegFlonum ; we don't have positive case, possible underflow
-Flonum)))) ; anything negative returns nan -Flonum))))) ; anything negative returns nan
(define fx->fl-type (fx-from-cases (define fx->fl-type
(lambda ()
(fx-from-cases
(-PosInt . -> . -PosFlonum) (-PosInt . -> . -PosFlonum)
(-Nat . -> . -NonNegFlonum) (-Nat . -> . -NonNegFlonum)
(-NegInt . -> . -NegFlonum) (-NegInt . -> . -NegFlonum)
(-NonPosInt . -> . -NonPosFlonum) (-NonPosInt . -> . -NonPosFlonum)
(-Int . -> . -Flonum))) (-Int . -> . -Flonum))))
(define make-flrectangular-type (-Flonum -Flonum . -> . -FloatComplex)) (define make-flrectangular-type (lambda () (-Flonum -Flonum . -> . -FloatComplex)))
(define flreal-part-type (-FloatComplex . -> . -Flonum)) (define flreal-part-type (lambda () (-FloatComplex . -> . -Flonum)))
(define flimag-part-type (-FloatComplex . -> . -Flonum)) (define flimag-part-type (lambda () (-FloatComplex . -> . -Flonum)))
;; There's a repetitive pattern in the types of each comparison operator. ;; There's a repetitive pattern in the types of each comparison operator.
;; As explained below, this is because filters don't do intersections. ;; As explained below, this is because filters don't do intersections.
@ -1461,8 +1503,8 @@
-InexactRealPosZero -InexactRealNegZero -InexactRealZero -InexactRealPosZero -InexactRealNegZero -InexactRealZero
-PosInexactReal -NonNegInexactReal -NonPosInexactReal -InexactReal -PosInexactReal -NonNegInexactReal -NonPosInexactReal -InexactReal
-RealZero -PosReal -NonNegReal -NonPosReal -Real)))] -RealZero -PosReal -NonNegReal -NonPosReal -Real)))]
[truncate round-type] [truncate (round-type)]
[round round-type] [round (round-type)]
[make-rectangular (cl->* (-Rat -Rat . -> . -ExactNumber) [make-rectangular (cl->* (-Rat -Rat . -> . -ExactNumber)
(-Flonum -Real . -> . -FloatComplex) (-Flonum -Real . -> . -FloatComplex)
@ -1747,117 +1789,117 @@
;; scheme/fixnum ;; scheme/fixnum
[fx+ fx+-type] [fx+ (fx+-type)]
[fx- fx--type] [fx- (fx--type)]
[fx* fx*-type] [fx* (fx*-type)]
[fxquotient fxquotient-type] [fxquotient (fxquotient-type)]
[fxremainder fxremainder-type] [fxremainder (fxremainder-type)]
[fxmodulo fxmodulo-type] [fxmodulo (fxmodulo-type)]
[fxabs fxabs-type] [fxabs (fxabs-type)]
[fxand fxand-type] [fxand (fxand-type)]
[fxior fxior-type] [fxior (fxior-type)]
[fxxor fxxor-type] [fxxor (fxxor-type)]
[fxnot fxnot-type] [fxnot (fxnot-type)]
[fxlshift fxlshift-type] [fxlshift (fxlshift-type)]
[fxrshift fxrshift-type] [fxrshift (fxrshift-type)]
[fx= fx=-type] [fx= (fx=-type)]
[fx< fx<-type] [fx< (fx<-type)]
[fx> fx>-type] [fx> (fx>-type)]
[fx<= fx<=-type] [fx<= (fx<=-type)]
[fx>= fx>=-type] [fx>= (fx>=-type)]
[fxmin fxmin-type] [fxmin (fxmin-type)]
[fxmax fxmax-type] [fxmax (fxmax-type)]
[unsafe-fx+ fx+-type] [unsafe-fx+ (fx+-type)]
[unsafe-fx- fx--type] [unsafe-fx- (fx--type)]
[unsafe-fx* fx*-type] [unsafe-fx* (fx*-type)]
[unsafe-fxquotient fxquotient-type] [unsafe-fxquotient (fxquotient-type)]
[unsafe-fxremainder fxremainder-type] [unsafe-fxremainder (fxremainder-type)]
[unsafe-fxmodulo fxmodulo-type] [unsafe-fxmodulo (fxmodulo-type)]
[unsafe-fxabs fxabs-type] [unsafe-fxabs (fxabs-type)]
[unsafe-fxand fxand-type] [unsafe-fxand (fxand-type)]
[unsafe-fxior fxior-type] [unsafe-fxior (fxior-type)]
[unsafe-fxxor fxxor-type] [unsafe-fxxor (fxxor-type)]
[unsafe-fxnot fxnot-type] [unsafe-fxnot (fxnot-type)]
[unsafe-fxlshift fxlshift-type] [unsafe-fxlshift (fxlshift-type)]
[unsafe-fxrshift fxrshift-type] [unsafe-fxrshift (fxrshift-type)]
[unsafe-fx= fx=-type] [unsafe-fx= (fx=-type)]
[unsafe-fx< fx<-type] [unsafe-fx< (fx<-type)]
[unsafe-fx> fx>-type] [unsafe-fx> (fx>-type)]
[unsafe-fx<= fx<=-type] [unsafe-fx<= (fx<=-type)]
[unsafe-fx>= fx>=-type] [unsafe-fx>= (fx>=-type)]
[unsafe-fxmin fxmin-type] [unsafe-fxmin (fxmin-type)]
[unsafe-fxmax fxmax-type] [unsafe-fxmax (fxmax-type)]
;; flonum ops ;; flonum ops
[flabs flabs-type] [flabs (flabs-type)]
[fl+ fl+-type] [fl+ (fl+-type)]
[fl- fl--type] [fl- (fl--type)]
[fl* fl*-type] [fl* (fl*-type)]
[fl/ fl/-type] [fl/ (fl/-type)]
[fl= fl=-type] [fl= (fl=-type)]
[fl<= fl<=-type] [fl<= (fl<=-type)]
[fl>= fl>=-type] [fl>= (fl>=-type)]
[fl> fl>-type] [fl> (fl>-type)]
[fl< fl<-type] [fl< (fl<-type)]
[flmin flmin-type] [flmin (flmin-type)]
[flmax flmax-type] [flmax (flmax-type)]
[flround flround-type] [flround (flround-type)]
[flfloor flfloor-type] [flfloor (flfloor-type)]
[flceiling flceiling-type] [flceiling (flceiling-type)]
[fltruncate flround-type] [fltruncate (flround-type)]
[flsin fl-unop] ; special cases (0s) not worth special-casing [flsin (fl-unop)] ; special cases (0s) not worth special-casing
[flcos fl-unop] [flcos (fl-unop)]
[fltan fl-unop] [fltan (fl-unop)]
[flatan fl-unop] [flatan (fl-unop)]
[flasin fl-unop] [flasin (fl-unop)]
[flacos fl-unop] [flacos (fl-unop)]
[fllog fllog-type] [fllog (fllog-type)]
[flexp flexp-type] [flexp (flexp-type)]
[flsqrt flsqrt-type] [flsqrt (flsqrt-type)]
[->fl fx->fl-type] [->fl (fx->fl-type)]
[make-flrectangular make-flrectangular-type] [make-flrectangular (make-flrectangular-type)]
[flreal-part flreal-part-type] [flreal-part (flreal-part-type)]
[flimag-part flimag-part-type] [flimag-part (flimag-part-type)]
[unsafe-flabs flabs-type] [unsafe-flabs (flabs-type)]
[unsafe-fl+ fl+-type] [unsafe-fl+ (fl+-type)]
[unsafe-fl- fl--type] [unsafe-fl- (fl--type)]
[unsafe-fl* fl*-type] [unsafe-fl* (fl*-type)]
[unsafe-fl/ fl/-type] [unsafe-fl/ (fl/-type)]
[unsafe-fl= fl=-type] [unsafe-fl= (fl=-type)]
[unsafe-fl<= fl<=-type] [unsafe-fl<= (fl<=-type)]
[unsafe-fl>= fl>=-type] [unsafe-fl>= (fl>=-type)]
[unsafe-fl> fl>-type] [unsafe-fl> (fl>-type)]
[unsafe-fl< fl<-type] [unsafe-fl< (fl<-type)]
[unsafe-flmin flmin-type] [unsafe-flmin (flmin-type)]
[unsafe-flmax flmax-type] [unsafe-flmax (flmax-type)]
;These are currently the same binding as the safe versions ;These are currently the same binding as the safe versions
;and so are not needed. If this changes they should be ;and so are not needed. If this changes they should be
;uncommented. There is a check in the definitions part of ;uncommented. There is a check in the definitions part of
;the file that makes sure that they are the same binding. ;the file that makes sure that they are the same binding.
; ;
;[unsafe-flround flround-type] ;[unsafe-flround (flround-type)]
;[unsafe-flfloor flfloor-type] ;[unsafe-flfloor (flfloor-type)]
;[unsafe-flceiling flceiling-type] ;[unsafe-flceiling (flceiling-type)]
;[unsafe-fltruncate flround-type] ;[unsafe-fltruncate (flround-type)]
;[unsafe-flsin fl-unop] ;[unsafe-flsin (fl-unop)]
;[unsafe-flcos fl-unop] ;[unsafe-flcos (fl-unop)]
;[unsafe-fltan fl-unop] ;[unsafe-fltan (fl-unop)]
;[unsafe-flatan fl-unop] ;[unsafe-flatan (fl-unop)]
;[unsafe-flasin fl-unop] ;[unsafe-flasin (fl-unop)]
;[unsafe-flacos fl-unop] ;[unsafe-flacos (fl-unop)]
;[unsafe-fllog fllog-type] ;[unsafe-fllog (fllog-type)]
;[unsafe-flexp flexp-type] ;[unsafe-flexp (flexp-type)]
; ;
[unsafe-flsqrt flsqrt-type] [unsafe-flsqrt (flsqrt-type)]
[unsafe-fx->fl fx->fl-type] [unsafe-fx->fl (fx->fl-type)]
[unsafe-make-flrectangular make-flrectangular-type] [unsafe-make-flrectangular (make-flrectangular-type)]
[unsafe-flreal-part flreal-part-type] [unsafe-flreal-part (flreal-part-type)]
[unsafe-flimag-part flimag-part-type] [unsafe-flimag-part (flimag-part-type)]