typed-racket/typed-racket-test/succeed/kw-def.rkt
2014-12-16 10:07:25 -05:00

88 lines
2.6 KiB
Racket

#lang typed/racket
(: f (case->
(Integer [#:k Integer] -> Integer)
(Integer String [#:k Integer] -> Integer)))
(define f
(lambda (x [z 2] #:k [y 1]) (+ x y)))
(: f2 (case->
(Integer [#:k Integer] -> Integer)
(Integer String [#:k Integer] -> Integer)))
(define (f2 x [z 2] #:k [y 1]) (+ x y))
(f 0)
(f 0 "s")
(f 0 #:k 1)
(f 0 "s" #:k 1)
(f 0 #:k 1 "s")
(f2 0)
(f2 0 "s")
(f2 0 #:k 1)
(f2 0 "s" #:k 1)
(f2 0 #:k 1 "s")
(: g (Integer #:k Integer -> Integer))
(define g
(lambda (x #:k y) (+ x y)))
(: g2 (Integer #:k Integer -> Integer))
(define (g2 x #:k y) (+ x y))
(g 0 #:k 1)
(g2 0 #:k 1)
;; Additional keyword function tests
;; FIXME: These really belong in the unit tests, but for some reason
;; the unit tests don't work well with keywords.
(: f0:a (#:a String -> (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))))