diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/abbrev.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/abbrev.rkt index dc1cf13c03..338b01da7b 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/abbrev.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/abbrev.rkt @@ -68,12 +68,6 @@ (define (-opt t) (Un (-val #f) t)) -(define (-Tuple l) - (-Tuple* l -Null)) - -(define (-Tuple* l b) - (foldr -pair b l)) - ;; Convenient constructor for Values ;; (wraps arg types with Result) (define/cond-contract (-values args) diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/base-abbrev.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/base-abbrev.rkt index 166d3be845..036c8b43ce 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/base-abbrev.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/base-abbrev.rkt @@ -59,10 +59,14 @@ ;; Void is needed for Params (define/decl -Void (make-Base 'Void #'void? void? #f)) -;; -lst* Type is needed by substitute for ListDots +;; -Tuple Type is needed by substitute for ListDots (define -pair make-Pair) (define (-lst* #:tail [tail -Null] . args) (for/fold ([tl tail]) ([a (in-list (reverse args))]) (-pair a tl))) +(define (-Tuple l) + (-Tuple* l -Null)) +(define (-Tuple* l b) + (foldr -pair b l)) ;; Simple union type constructor, does not check for overlaps ;; Normalizes representation by sorting types. 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 5d6f23c4c5..f466b0961f 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 @@ -4,7 +4,7 @@ racket/match racket/set racket/lazy-require (contract-req) - (only-in (types base-abbrev) -lst* -result) + (only-in (types base-abbrev) -Tuple* -lst -Null -result ManyUniv) (rep type-rep rep-utils) (utils tc-utils) (rep free-variance) @@ -99,19 +99,21 @@ (if (eq? name dbound) ;; We need to recur first, just to expand out any dotted usages of this. (let ([expanded (sb dty)]) - (for/fold ([t (make-Value null)]) + (for/fold ([t (if rimage (-lst rimage) -Null)]) ([img (in-list (reverse images))]) (make-Pair (substitute img name expanded) t))) (make-ListDots (sb dty) dbound))] [#:ValuesDots types dty dbound (if (eq? name dbound) - (make-Values - (append - (map sb types) - ;; We need to recur first, just to expand out any dotted usages of this. - (let ([expanded (sb dty)]) - (for/list ([img (in-list images)]) - (-result (substitute img name expanded)))))) + (if rimage + ManyUniv + (make-Values + (append + (map sb types) + ;; We need to recur first, just to expand out any dotted usages of this. + (let ([expanded (sb dty)]) + (for/list ([img (in-list images)]) + (-result (substitute img name expanded))))))) (make-ValuesDots (map sb types) (sb dty) dbound))] [#:arr dom rng rest drest kws (if (and (pair? drest) @@ -148,9 +150,8 @@ (sb dty) (if (eq? name dbound) image-bound dbound)))] [#:ListDots dty dbound - (apply -lst* + (-Tuple* (if (eq? name dbound) pre-image null) - #:tail (make-ListDots (sb dty) (if (eq? name dbound) image-bound dbound)))] [#:F name* diff --git a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/subst-tests.rkt b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/subst-tests.rkt index 85d65d6006..a03957753e 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/subst-tests.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-test/tests/typed-racket/unit-tests/subst-tests.rkt @@ -10,14 +10,20 @@ (define-syntax-rule (s img var tgt result) (test-eq? (format "~a" '(img tgt)) (substitute img 'var tgt) result)) + +(define-syntax-rule (s* imgs rest var tgt result) + (test-eq? (format "~a" '(img tgt)) (substitute-dots (list . imgs) rest 'var tgt) result)) + (define-syntax-rule (s... imgs var tgt result) (test-eq? (format "~a" '(img tgt)) (substitute-dots (list . imgs) #f 'var tgt) result)) (define tests (test-suite "Tests for substitution" - (s -Number a (-v a) -Number) - (s... (-Number -Boolean) a (make-Function (list (make-arr-dots null -Number (-v a) 'a))) (-Number -Boolean . -> . -Number)) - (s... (-Number -Boolean) a (make-Function (list (make-arr-dots (list -String) -Number (-v a) 'a))) (-String -Number -Boolean . -> . -Number)) - (s... (-Number -Boolean) a (make-Function (list (make-arr-dots (list -String) -Number (-v b) 'a))) (-String (-v b) (-v b) . -> . -Number)) - (s... (-Number -Boolean) a (make-Function (list (make-arr-dots (list -String) -Number (-v b) 'b))) - (make-Function (list (make-arr-dots (list -String) -Number (-v b) 'b)))))) + (s -Number a (-v a) -Number) + (s* (-Symbol -String) #f a (make-ListDots (-v a) 'a) (-lst* -Symbol -String)) + (s* (-Symbol -String) Univ a (make-ListDots (-v a) 'a) (-lst* -Symbol -String #:tail (-lst Univ))) + (s... (-Number -Boolean) a (make-Function (list (make-arr-dots null -Number (-v a) 'a))) (-Number -Boolean . -> . -Number)) + (s... (-Number -Boolean) a (make-Function (list (make-arr-dots (list -String) -Number (-v a) 'a))) (-String -Number -Boolean . -> . -Number)) + (s... (-Number -Boolean) a (make-Function (list (make-arr-dots (list -String) -Number (-v b) 'a))) (-String (-v b) (-v b) . -> . -Number)) + (s... (-Number -Boolean) a (make-Function (list (make-arr-dots (list -String) -Number (-v b) 'b))) + (make-Function (list (make-arr-dots (list -String) -Number (-v b) 'b))))))