From aa1d36f44e0ef49d263cf53f97e578c1b58dca31 Mon Sep 17 00:00:00 2001 From: Andrew Kent Date: Fri, 14 Oct 2016 15:15:46 -0400 Subject: [PATCH] add type syntax for Union/Intersection --- .../typed-racket/scribblings/reference/types.scrbl | 2 ++ .../typed-racket/base-env/base-types-extra.rkt | 7 +++---- typed-racket-lib/typed-racket/private/parse-type.rkt | 6 ++++-- typed-racket-test/unit-tests/parse-type-tests.rkt | 2 ++ 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/typed-racket-doc/typed-racket/scribblings/reference/types.scrbl b/typed-racket-doc/typed-racket/scribblings/reference/types.scrbl index aff809dd..b8d43786 100644 --- a/typed-racket-doc/typed-racket/scribblings/reference/types.scrbl +++ b/typed-racket-doc/typed-racket/scribblings/reference/types.scrbl @@ -820,6 +820,8 @@ this top type. #s((salad food 1) "quinoa" "EVOO" salad))] } +@defalias[Union U] +@defalias[Intersection ∩] @defalias[→ ->] @defalias[case→ case->] @defalias[∀ All] diff --git a/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt b/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt index bc9387f9..2e20d314 100644 --- a/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt +++ b/typed-racket-lib/typed-racket/base-env/base-types-extra.rkt @@ -1,7 +1,7 @@ #lang racket/base (require (for-syntax "type-name-error.rkt" - racket/base syntax/stx)) + racket/base)) (define-syntax (define-other-types stx) (syntax-case stx () @@ -12,10 +12,9 @@ ;; special type names that are not bound to particular types (define-other-types - -> ->* case-> U Rec All Opaque Vector + -> ->* case-> U Union ∩ Intersection Rec All Opaque Vector Parameterof List List* Class Object Row Unit Values AnyValues Instance Refinement - pred Struct Struct-Type Prefab Top Bot Distinction Sequenceof - ∩) + pred Struct Struct-Type Prefab Top Bot Distinction Sequenceof) (provide (rename-out [All ∀] [U Un] diff --git a/typed-racket-lib/typed-racket/private/parse-type.rkt b/typed-racket-lib/typed-racket/private/parse-type.rkt index 3c0c24cb..cae03333 100644 --- a/typed-racket-lib/typed-racket/private/parse-type.rkt +++ b/typed-racket-lib/typed-racket/private/parse-type.rkt @@ -99,6 +99,7 @@ (define-literal-syntax-class #:for-label case->^ (case-> case-lambda)) (define-literal-syntax-class #:for-label Rec) (define-literal-syntax-class #:for-label U) +(define-literal-syntax-class #:for-label Union) (define-literal-syntax-class #:for-label All) (define-literal-syntax-class #:for-label Opaque) (define-literal-syntax-class #:for-label Parameter) @@ -114,6 +115,7 @@ (define-literal-syntax-class #:for-label Distinction) (define-literal-syntax-class #:for-label Sequenceof) (define-literal-syntax-class #:for-label ∩) +(define-literal-syntax-class #:for-label Intersection) ;; (Syntax -> Type) -> Syntax Any -> Syntax ;; See `parse-type/id`. This is a curried generalization. @@ -470,9 +472,9 @@ (if (memq var (fv t*)) (make-Mu var t*) t*))))] - [(:U^ ts ...) + [((~or :U^ :Union^) ts ...) (apply Un (parse-types #'(ts ...)))] - [(:∩^ ts ...) + [((~or :∩^ :Intersection^) ts ...) (for/fold ([ty Univ]) ([t (in-list (parse-types #'(ts ...)))]) (intersect ty t))] diff --git a/typed-racket-test/unit-tests/parse-type-tests.rkt b/typed-racket-test/unit-tests/parse-type-tests.rkt index 3ac1df2d..2d1e8bea 100644 --- a/typed-racket-test/unit-tests/parse-type-tests.rkt +++ b/typed-racket-test/unit-tests/parse-type-tests.rkt @@ -121,6 +121,7 @@ [(-> Number Number Number * Boolean) ((list N N) N . t:->* . B)] ;[((. Number) -> Number) (->* (list) N N)] ;; not legal syntax [(U Number Boolean) (t:Un N B)] + [(Union Number Boolean) (t:Un N B)] [(U Number Boolean Number) (t:Un N B)] [(U Number Boolean 1) (t:Un N B)] [(All (a) (Listof a)) (-poly (a) (make-Listof a))] @@ -411,6 +412,7 @@ [(∩) Univ] [(∩ Any) Univ] [(∩ String Symbol) -Bottom] + [(Intersection String Symbol) -Bottom] [(∩ (-> Number Number) (-> String String)) (-unsafe-intersect (t:-> -String -String) (t:-> -Number -Number))]