From 5470604b70b53010308d558299ba3668b7b8af17 Mon Sep 17 00:00:00 2001 From: Eric Dobson Date: Wed, 21 May 2014 09:10:43 -0700 Subject: [PATCH] Make unfold use typecase instead of subst. original commit: 42acb08399729acc20f6900b330bab9396f796d8 --- .../typed-racket/types/substitute.rkt | 14 +++++++------- .../typed-racket-lib/typed-racket/types/utils.rkt | 8 +++++--- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/substitute.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/substitute.rkt index 7ab15034..49bfeb42 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/substitute.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/substitute.rkt @@ -38,15 +38,15 @@ ;; TODO: Figure out if free var checking/short circuiting is actually a performance improvement. ;; substitute-many : Hash[Name,Type] Type -> Type -(define/cond-contract (substitute-many subst target #:Un [Un (lambda (args) (apply Un args))]) - ((simple-substitution/c Type?) (#:Un procedure?) . ->* . Type?) - (define (sb t) (substitute-many subst t #:Un Un)) +(define/cond-contract (substitute-many subst target) + (simple-substitution/c Type? . -> . Type?) + (define (sb t) (substitute-many subst t)) (define names (hash-keys subst)) (define fvs (free-vars* target)) (if (ormap (lambda (name) (free-vars-has-key? fvs name)) names) (type-case (#:Type sb #:Filter (sub-f sb) #:Object (sub-o sb)) target - [#:Union tys (Un (map sb tys))] + [#:Union tys (apply Un (map sb tys))] [#:F name (hash-ref subst name target)] [#:arr dom rng rest drest kws (cond @@ -81,9 +81,9 @@ ;; substitute : Type Name Type -> Type -(define/cond-contract (substitute image name target #:Un [Un (lambda (args) (apply Un args))]) - ((Type/c symbol? Type?) (#:Un procedure?) . ->* . Type?) - (substitute-many (hash name image) target #:Un Un)) +(define/cond-contract (substitute image name target) + (Type/c symbol? Type? . -> . Type?) + (substitute-many (hash name image) target)) ;; implements angle bracket substitution from the formalism ;; substitute-dots : Listof[Type] Option[type] Name Type -> Type diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/utils.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/utils.rkt index 875f035a..ce508eb0 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/utils.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/utils.rkt @@ -19,9 +19,11 @@ (define (unfold t) (match t [(Mu: name b) - (substitute t name b #:Un (lambda (tys) - (make-Union (sort tys < #:key Type-seq))))] - [_ (int-err "unfold: requires Mu type, got ~a" t)])) + (define (sb target) + (type-case (#:Type sb #:Filter (sub-f sb) #:Object (sub-o sb)) + target + [#:F name* (if (eq? name name*) t target)])) + (sb b)])) (define (instantiate-poly t types) (match t