diff --git a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/kw-types.rkt b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/kw-types.rkt index 732505ac..9daa8804 100644 --- a/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/kw-types.rkt +++ b/pkgs/typed-racket-pkgs/typed-racket-lib/typed-racket/types/kw-types.rkt @@ -19,6 +19,8 @@ #:kws kw-t #:rest rest #:drest drest))) + ;; the kw function protocol passes rest args as an explicit list + (define rest-type (if rest (-lst rest) empty)) (define ts (flatten (list @@ -31,39 +33,38 @@ plain-t (for/list ([t (in-list opt-t)]) (-opt t)) (for/list ([t (in-list opt-t)]) -Boolean) - ;; the kw function protocol passes rest args as an explicit list - (if rest (-lst rest) empty)))) + rest-type))) + ;; the kw protocol puts the arguments in keyword-sorted order in the + ;; function header, so we need to sort the types to match + (define sorted-kws + (sort kw-t keyword (List String))) +(define (f0:a #:a a) (list a)) + +(: f1:a (Symbol #:a String -> (List Symbol String))) +(define (f1:a x #:a a) (list x a)) + +(: f1:a? (Symbol [#:a String] -> (List Symbol String))) +(define (f1:a? x #:a [a "a"]) (list x a)) + +(: f1+:a (String #:a String String * -> (Listof String))) +(define (f1+:a x #:a a . args) (cons x (cons a args))) + +(: f1+:a? (String [#:a String] String * -> (Listof String))) +(define (f1+:a? x #:a [a "a"] . args) (cons x (cons a args))) + +(: f0:a:b (#:a String #:b Symbol -> (List String Symbol))) +(define (f0:a:b #:a a #:b b) (list a b)) + +(: f0:a?:b ([#:a String] #:b Symbol -> (List String Symbol))) +(define (f0:a?:b #:a [a "a"] #:b b) (list a b)) + +(: f1:a:b (String #:a String #:b Symbol -> (List String String Symbol))) +(define (f1:a:b x #:a a #:b b) (list x a b)) + +(: f1:a?:b (String [#:a String] #:b Symbol -> (List String String Symbol))) +(define (f1:a?:b x #:a [a "a"] #:b b) (list x a b)) + +(: f1+:a:b (String #:a String #:b String String * -> (Listof String))) +(define (f1+:a:b x #:a a #:b b . args) (cons x (cons a (cons b args)))) + +(: f0:a:b? (#:a String [#:b Symbol] -> (List String Symbol))) +(define (f0:a:b? #:a a #:b [b 'b]) (list a b)) + +(: f0:a?:b? ([#:a String] [#:b Symbol] -> (List String Symbol))) +(define (f0:a?:b? #:a [a "a"] #:b [b 'b]) (list a b)) + +(: f1:a:b? (String #:a String [#:b Symbol] -> (List String String Symbol))) +(define (f1:a:b? x #:a a #:b [b 'b]) (list x a b)) + +(: f1:a?:b? (String [#:a String] [#:b Symbol] -> (List String String Symbol))) +(define (f1:a?:b? x #:a [a "a"] #:b [b 'b]) (list x a b)) + +(: f1+:a:b? (String #:a String [#:b String] String * -> (Listof String))) +(define (f1+:a:b? x #:a a #:b [b "b"] . args) + (cons x (cons a (cons b args)))) + +(: f1+:a?:b? (String [#:a String] [#:b String] String * -> (Listof String))) +(define (f1+:a?:b? x #:a [a "a"] #:b [b "b"] . args) + (cons x (cons a (cons b args))))