88 lines
2.6 KiB
Racket
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))))
|