diff --git a/collects/typed-scheme/private/lexical-env.ss b/collects/typed-scheme/private/lexical-env.ss index 2b2a7d7432..131c018ce4 100644 --- a/collects/typed-scheme/private/lexical-env.ss +++ b/collects/typed-scheme/private/lexical-env.ss @@ -21,7 +21,11 @@ ;; identifer -> Type (define (lookup-type/lexical i) (lookup (lexical-env) i - (lambda (i) (lookup-type i)))) + (lambda (i) (lookup-type + i (lambda () + (if (lookup (dotted-env) i (lambda _ #f)) + (tc-error "Rest variable ~a with ... type used in an inappropriate context" (syntax-e i)) + (lookup-fail (syntax-e i)))))))) ;; refine the type of i in the lexical env ;; (identifier type -> type) identifier -> environment diff --git a/collects/typed-scheme/private/signatures.ss b/collects/typed-scheme/private/signatures.ss index 48535a2bed..9f8b0dba0e 100644 --- a/collects/typed-scheme/private/signatures.ss +++ b/collects/typed-scheme/private/signatures.ss @@ -53,3 +53,6 @@ (define-signature tc-let^ (tc/let-values tc/letrec-values tc/let-values/check tc/letrec-values/check)) +(define-signature tc-dots^ + (tc/dots)) + diff --git a/collects/typed-scheme/private/tc-app-unit.ss b/collects/typed-scheme/private/tc-app-unit.ss index 58372a690c..f342f97d59 100644 --- a/collects/typed-scheme/private/tc-app-unit.ss +++ b/collects/typed-scheme/private/tc-app-unit.ss @@ -12,13 +12,14 @@ "type-effect-printer.ss" "type-annotation.ss" "resolve-type.ss" + "type-environments.ss" (only-in scheme/private/class-internal make-object do-make-object) mzlib/trace mzlib/pretty syntax/kerncase scheme/match (for-template "internal-forms.ss" scheme/base (only-in scheme/private/class-internal make-object do-make-object))) -(import tc-expr^ tc-lambda^) +(import tc-expr^ tc-lambda^ tc-dots^) (export tc-app^) ;; comparators that inform the type system @@ -399,7 +400,8 @@ (define (tc/app/internal form expected) (kernel-syntax-case* form #f - (values apply not list list* call-with-values do-make-object make-object cons) ;; the special-cased functions + (values apply not list list* call-with-values do-make-object make-object cons + andmap ormap) ;; the special-cased functions ;; special cases for classes [(#%plain-app make-object cl args ...) (tc/app/internal #'(#%plain-app do-make-object cl (#%plain-app list args ...) (#%plain-app list)) expected)] @@ -539,6 +541,19 @@ ;(printf "special case~n") (tc/rec-lambda/check form #'(args ...) #'body #'lp ts expected) (ret expected))] + [(#%plain-app or/andmap f arg) + (and (or (free-identifier=? #'or/andmap #'ormap) + (free-identifier=? #'or/andmap #'andmap)) + (with-handlers (#;[exn:fail? (lambda _ #f)]) + (tc/dots #'arg) + #t)) + (let-values ([(ty bound) (tc/dots #'arg)]) + (parameterize ([current-tvars (extend-env (list bound) + (list (make-DottedBoth (make-F bound))) + (current-tvars))]) + (match-let* ([ft (tc-expr #'f)] + [(tc-result: t) (tc/funapp #'f #'(arg) ft (list (ret ty)) #f)]) + (ret (Un (-val #f) t)))))] ;; default case [(#%plain-app f args ...) (begin diff --git a/collects/typed-scheme/private/tc-utils.ss b/collects/typed-scheme/private/tc-utils.ss index c2d654ba0c..00919fe3c2 100644 --- a/collects/typed-scheme/private/tc-utils.ss +++ b/collects/typed-scheme/private/tc-utils.ss @@ -41,7 +41,6 @@ stx)) (define (raise-typecheck-error msg stxs) - (printf "msg : ~a~n" msg) (raise (make-exn:fail:syntax (string-append "typecheck: " msg) (current-continuation-marks) stxs))) diff --git a/collects/typed-scheme/private/typechecker.ss b/collects/typed-scheme/private/typechecker.ss index 7db81a57c1..3ec16bcfcf 100644 --- a/collects/typed-scheme/private/typechecker.ss +++ b/collects/typed-scheme/private/typechecker.ss @@ -5,10 +5,10 @@ (only-in scheme/unit provide-signature-elements) "signatures.ss" "tc-toplevel.ss" "tc-if-unit.ss" "tc-lambda-unit.ss" "tc-app-unit.ss" - "tc-let-unit.ss" + "tc-let-unit.ss" "tc-dots-unit.ss" "tc-expr-unit.ss" "check-subforms-unit.ss") (provide-signature-elements typechecker^ tc-expr^) (define-values/link-units/infer - tc-toplevel@ tc-if@ tc-lambda@ tc-app@ tc-let@ tc-expr@ check-subforms@) + tc-toplevel@ tc-if@ tc-lambda@ tc-dots@ tc-app@ tc-let@ tc-expr@ check-subforms@)