Added the Inexact-Complex type.

original commit: dcfb2d8a94b1359217b9451b7a97d4afa425a6da
This commit is contained in:
Vincent St-Amour 2010-06-28 16:39:20 -04:00
parent c6a22a53f4
commit b7d9ed75e2
9 changed files with 84 additions and 23 deletions

View File

@ -0,0 +1,9 @@
#;
(exn-pred 2)
#lang typed/scheme
(ann 1+2i Inexact-Complex)
(: f (Real -> Inexact-Complex))
(define (f x)
(* x 2.0)) ; x can be exact 0

View File

@ -0,0 +1,9 @@
#lang typed/scheme
(ann 1.1+2.0i Inexact-Complex)
(ann 1+2.0i Inexact-Complex)
(ann (real-part 1.1+2.0i) Float)
(ann (real-part 1+2.0i) Float)
(ann (imag-part 1.1+2.0i) Float)
(ann (+ 2.0 2.0+2.0i) Inexact-Complex)
(ann (+ 2 2.0+2.0i) Inexact-Complex)

View File

@ -842,6 +842,10 @@
(tc-l 5# -Flonum)
(tc-l 5.0 -Flonum)
(tc-l 5.1 -Flonum)
(tc-l 1+1i N)
(tc-l 1+1.0i -InexactComplex)
(tc-l 1.0+1i -InexactComplex)
(tc-l 1.0+1.1i -InexactComplex)
(tc-l #t (-val #t))
(tc-l "foo" -String)
(tc-l foo (-val 'foo))

View File

@ -61,7 +61,7 @@
[complex? (make-pred-ty N)]
[rational? (make-pred-ty -Real)]
[exact? (asym-pred N B (-FS -top (-not-filter -ExactRational 0)))]
[inexact? (asym-pred N B (-FS -top (-not-filter -Flonum 0)))]
[inexact? (asym-pred N B (-FS -top (-not-filter (Un -Flonum -InexactComplex) 0)))]
[fixnum? (make-pred-ty -Fixnum)]
[positive? (-> -Real B)]
[negative? (-> -Real B)]
@ -94,6 +94,7 @@
[* (apply cl->*
(append (for/list ([t (list -Pos -Nat -Integer -ExactRational -Flonum)]) (->* (list) t t))
(list (->* (list) -Real -Real))
(list (->* (list) -InexactComplex -InexactComplex))
(list (->* (list) N N))))]
[+ (apply cl->*
(append (for/list ([t (list -Pos -Nat -Integer -ExactRational -Flonum)]) (->* (list) t t))
@ -102,6 +103,9 @@
(list (->* (list -Flonum) -Real -Flonum))
(list (->* (list -Real -Flonum) -Real -Flonum))
(list (->* (list) -Real -Real))
(list (->* (list -Real) -InexactComplex -InexactComplex))
(list (->* (list -InexactComplex) -Real -InexactComplex))
(list (->* (list) -InexactComplex -InexactComplex))
(list (->* (list) N N))))]
[- (apply cl->*
@ -110,6 +114,9 @@
(list (->* (list -Flonum) -Real -Flonum))
(list (->* (list -Real -Flonum) -Real -Flonum))
(list (->* (list -Real) -Real -Real))
(list (->* (list -Real) -InexactComplex -InexactComplex))
(list (->* (list -InexactComplex) -Real -InexactComplex))
(list (->* (list -InexactComplex) -InexactComplex -InexactComplex))
(list (->* (list N) N N))))]
[/ (apply cl->*
(append (list (->* (list -Integer) -Integer -ExactRational))
@ -118,6 +125,7 @@
;; only exact 0 as first argument can cause the result of a division involving inexacts to be exact
(list (->* (list -Flonum) -Real -Flonum))
(list (->* (list -Real) -Real -Real))
(list (->* (list -InexactComplex) -InexactComplex -InexactComplex))
(list (->* (list N) N N))))]
[max (cl->* (->* (list -PositiveFixnum) -Fixnum -PositiveFixnum)
@ -149,6 +157,7 @@
(-> -ExactRational -ExactRational)
(-> -Flonum -Flonum)
(-> -Real -Real)
(-> -InexactComplex -InexactComplex)
(-> N N))]
[sub1 (cl->* (-> -Pos -Nat)
@ -156,6 +165,7 @@
(-> -ExactRational -ExactRational)
(-> -Flonum -Flonum)
(-> -Real -Real)
(-> -InexactComplex -InexactComplex)
(-> N N))]
[quotient (cl->* (-NonnegativeFixnum -NonnegativeFixnum . -> . -NonnegativeFixnum)
@ -199,7 +209,7 @@
;; exactness
[exact->inexact (cl->*
(-Real . -> . -Flonum)
(N . -> . N))]
(N . -> . -InexactComplex))]
[inexact->exact (cl->*
(-Real . -> . -ExactRational)
(N . -> . N))]
@ -208,33 +218,47 @@
[ceiling rounder]
[truncate rounder]
[round rounder]
[make-rectangular (-Real -Real . -> . N)]
[make-polar (-Real -Real . -> . N)]
[real-part (N . -> . -Real)]
[imag-part (N . -> . -Real)]
[magnitude (N . -> . -Real)]
[angle (N . -> . -Real)]
[numerator (-Real . -> . -Real)]
[denominator (-Real . -> . -Real)]
[rationalize (-Real -Real . -> . N)]
[make-rectangular (cl->* (-Flonum -Flonum . -> . -InexactComplex)
(-Real -Real . -> . N))]
[make-polar (cl->* (-Flonum -Flonum . -> . -InexactComplex)
(-Real -Real . -> . N))]
[real-part (cl->* (-InexactComplex . -> . -Flonum)
(N . -> . -Real))]
[imag-part (cl->* (-InexactComplex . -> . -Flonum)
(N . -> . -Real))]
[magnitude (cl->* (-InexactComplex . -> . -Flonum)
(N . -> . -Real))]
[angle (cl->* (-InexactComplex . -> . -Flonum)
(N . -> . -Real))]
[numerator (cl->* (-ExactRational . -> . -Integer)
(-Real . -> . -Real))]
[denominator (cl->* (-ExactRational . -> . -Integer)
(-Real . -> . -Real))]
[rationalize (cl->* (-ExactRational -ExactRational . -> . -ExactRational)
(-Flonum . -> . -Flonum)
(-Real -Real . -> . N))]
[expt (cl->* (-Nat -Nat . -> . -Nat)
(-Integer -Nat . -> . -Integer)
(-Real -Integer . -> . -Real)
(-InexactComplex -InexactComplex . -> . -InexactComplex)
(N N . -> . N))]
[sqrt (cl->*
(-Nat . -> . -Real)
(-InexactComplex . -> . -InexactComplex)
(N . -> . N))]
[log (cl->*
(-Pos . -> . -Real)
(-InexactComplex . -> . -InexactComplex)
(N . -> . N))]
[exp (cl->* (-Real . -> . -Real)
(-InexactComplex . -> . -InexactComplex)
(N . -> . N))]
[cos (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (N . -> . N))]
[sin (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (N . -> . N))]
[tan (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (N . -> . N))]
[acos (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (N . -> . N))]
[asin (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (N . -> . N))]
[atan (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (N . -> . N) (-Real -Real . -> . N))]
[cos (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (-InexactComplex . -> . -InexactComplex) (N . -> . N))]
[sin (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (-InexactComplex . -> . -InexactComplex) (N . -> . N))]
[tan (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (-InexactComplex . -> . -InexactComplex) (N . -> . N))]
[acos (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (-InexactComplex . -> . -InexactComplex) (N . -> . N))]
[asin (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (-InexactComplex . -> . -InexactComplex) (N . -> . N))]
[atan (cl->* (-Flonum . -> . -Flonum) (-Real . -> . -Real) (-InexactComplex . -> . -InexactComplex) (N . -> . N) (-Real -Real . -> . N))]
[gcd (cl->* (null -Fixnum . ->* . -Fixnum) (null -Integer . ->* . -Integer))]
[lcm (null -Integer . ->* . -Integer)]
@ -248,12 +272,16 @@
(-> -ExactRational -ExactRational)
(-> -Flonum -Flonum)
(-> -Real -Real)
(-> -InexactComplex -InexactComplex)
(-> N N))]
[sgn (N . -> . N)]
[conjugate (N . -> . N)]
[sinh (N . -> . N)]
[cosh (N . -> . N)]
[tanh (N . -> . N)]
[conjugate (cl->* (-InexactComplex . -> . -InexactComplex)
(N . -> . N))]
[sinh (cl->* (-InexactComplex . -> . -InexactComplex)
(N . -> . N))]
[cosh (cl->* (-InexactComplex . -> . -InexactComplex)
(N . -> . N))]
[tanh (cl->* (-InexactComplex . -> . -InexactComplex)
(N . -> . N))]
;; unsafe numeric ops
[unsafe-flabs fl-unop]

View File

@ -1,6 +1,7 @@
#lang s-exp "type-env-lang.rkt"
[Complex -Number]
[Inexact-Complex -InexactComplex]
[Number -Number]
[Integer -Integer]
[Real -Real]

View File

@ -34,6 +34,7 @@ any expression of this type will not evaluate to a value.}
@deftogether[(
@defidform[Number]
@defidform[Complex]
@defidform[Inexact-Complex]
@defidform[Real]
@defidform[Float]
@defidform[Exact-Rational]

View File

@ -43,6 +43,9 @@
[(~var i (3d (conjoin number? exact? rational?))) -ExactRational]
[(~var i (3d inexact-real?)) -Flonum]
[(~var i (3d real?)) -Real]
;; a complex number can't have an inexact imaginary part and an exact real part
[(~var i (3d (conjoin number? (lambda (x) (inexact-real? (imag-part x))))))
-InexactComplex]
[(~var i (3d number?)) -Number]
[i:str -String]
[i:char -Char]

View File

@ -150,6 +150,9 @@
;; Numeric hierarchy
(define -Number (make-Base 'Number #'number?))
;; a complex number can't have an inexact imaginary part and an exact real part
(define -InexactComplex (make-Base 'InexactComplex #'(and/c number? (lambda (x) (inexact-real? (imag-part x))))))
(define -Flonum (make-Base 'Flonum #'inexact-real?))
(define -ExactRational

View File

@ -233,10 +233,11 @@
[((Union: (list)) _) A0]
;; value types
[((Value: v1) (Value: v2)) (=> unmatch) (if (equal? v1 v2) A0 (unmatch))]
;; now we encode the numeric hierarchy - bletch
;; now we encode the numeric hierarchy - bletch
[((Base: 'Integer _) (Base: 'Number _)) A0]
[((Base: 'Flonum _) (== -Real =t)) A0]
[((Base: 'Integer _) (== -Real =t)) A0]
[((Base: 'Flonum _) (Base: 'InexactComplex _)) A0]
[((Base: 'Flonum _) (Base: 'Number _)) A0]
[((Base: 'Exact-Rational _) (Base: 'Number _)) A0]
[((Base: 'Integer _) (Base: 'Exact-Rational _)) A0]
@ -263,6 +264,8 @@
[((== -Fixnum =t) (Base: 'Exact-Rational _)) A0]
[((== -Fixnum =t) (Base: 'Integer _)) A0]
[((Base: 'InexactComplex _) (Base: 'Number _)) A0]
;; values are subtypes of their "type"
[((Value: (? exact-integer? n)) (Base: 'Integer _)) A0]