diff --git a/collects/tests/typed-scheme/unit-tests/parse-type-tests.ss b/collects/tests/typed-scheme/unit-tests/parse-type-tests.ss index b40e131b..caf3dda7 100644 --- a/collects/tests/typed-scheme/unit-tests/parse-type-tests.ss +++ b/collects/tests/typed-scheme/unit-tests/parse-type-tests.ss @@ -8,7 +8,7 @@ (schemeunit)) (require (rename-in (private type-effect-convenience) [-> t:->]) - (except-in (private base-types) Un) + (private base-types) (for-template (private base-types))) (provide parse-type-tests) diff --git a/collects/typed-scheme/main.ss b/collects/typed-scheme/main.ss index f2bcf797..f4454c49 100644 --- a/collects/typed-scheme/main.ss +++ b/collects/typed-scheme/main.ss @@ -3,7 +3,9 @@ (providing (libs (except scheme/base #%module-begin #%top-interaction with-handlers lambda #%app) - (except "private/prims.ss")) + (except "private/prims.ss") + (except "private/base-types.ss") + (except "private/base-types-extra.ss")) (basics #%module-begin #%top-interaction lambda diff --git a/collects/typed-scheme/private/base-types-extra.ss b/collects/typed-scheme/private/base-types-extra.ss new file mode 100644 index 00000000..db633260 --- /dev/null +++ b/collects/typed-scheme/private/base-types-extra.ss @@ -0,0 +1,19 @@ +#lang scheme/base + +(require (for-syntax scheme/base)) + +(define-syntax (define-other-types stx) + (syntax-case stx () + [(_ nm ...) + #'(begin (define-syntax nm (lambda (stx) (raise-syntax-error 'type-check "type name used out of context" stx))) ... + (provide nm) ...)])) + +;; special types names that are not bound to particular types + +(define-other-types + -> U mu Un All Opaque Vectorof + Parameter Tuple Class Values) + +(provide (rename-out [All ∀] + [mu Rec])) + diff --git a/collects/typed-scheme/private/base-types.ss b/collects/typed-scheme/private/base-types.ss index 13226af4..28c595e9 100644 --- a/collects/typed-scheme/private/base-types.ss +++ b/collects/typed-scheme/private/base-types.ss @@ -1,90 +1,31 @@ -#lang scheme/base +#lang s-exp "type-env-lang.ss" -(require (except-in "../utils/utils.ss" extend)) -(require (for-syntax - scheme/base - (env init-envs) - (except-in (rep type-rep) make-arr) - "type-effect-convenience.ss" - (only-in "type-effect-convenience.ss" [make-arr* make-arr]) - "union.ss")) +[Number N] +[Integer -Integer] +[Void -Void] +[Boolean B] +[Symbol Sym] +[String -String] +[Any Univ] +[Port -Port] +[Path -Path] +[Regexp -Regexp] +[PRegexp -PRegexp] +[Char -Char] +[Option (-poly (a) (-opt a))] +[List (-lst Univ)] +[Listof -Listof] +[Namespace -Namespace] +[Input-Port -Input-Port] +[Output-Port -Output-Port] +[Bytes -Bytes] +[EOF (-val eof)] +[Keyword -Keyword] +[HashTable (-poly (a b) (-HT a b))] +[Promise (-poly (a) (-Promise a))] +[Pair (-poly (a b) (-pair a b))] +[Boxof (-poly (a) (make-Box a))] +[Syntax Any-Syntax] +[Identifier Ident] +[Procedure (make-Function (list (make-top-arr)))] -;; the initial type name environment - just the base types -(define-syntax (define-tname-env stx) - (syntax-case stx () - [(_ var provider initer [nm ty] ...) - #`(begin - (define-syntax nm (lambda (stx) (raise-syntax-error 'type-check "type name used out of context" stx))) ... - (provide nm) ... - (define-syntax provider (lambda (stx) #'(begin (provide nm) ...))) - (provide provider) - (define-for-syntax (initer) - (initialize-type-name-env - (list (list #'nm ty) ...))) - (begin-for-syntax - ;(printf "running base-types~n") - (initer)))])) - -(define-syntax (define-other-types stx) - (syntax-case stx () - [(_ provider requirer nm ...) - (with-syntax ([(nms ...) (generate-temporaries #'(nm ...))]) - (let ([body-maker (lambda (stx) - (map (lambda (nm nms) (datum->syntax stx `(rename ,#'mod ,nm ,nms))) - (syntax->list #'(nm ...)) - (syntax->list #'(nms ...))))]) - #'(begin (define-syntax nms (lambda (stx) (raise-syntax-error 'type-check "type name used out of context" stx))) ... - (provide nms) ... - (define-syntax (requirer stx) - (syntax-case stx () - [(_ mod) - (datum->syntax - stx - `(require . ,(map (lambda (nm* nms*) (datum->syntax stx `(rename-in ,#'mod [,nm* ,nms*]))) - (list 'nm ...) - (list #'nms ...))))])) - (define-syntax provider (lambda (stx) #'(begin (provide (rename-out [nms nm])) ...))) - (provide provider requirer))))])) - -;; the initial set of available type names -(define-tname-env initial-type-names provide-tnames init-tnames - [Number N] - [Integer -Integer] - [Void -Void] - [Boolean B] - [Symbol Sym] - [String -String] - [Any Univ] - [Port -Port] - [Path -Path] - [Regexp -Regexp] - [PRegexp -PRegexp] - [Char -Char] - [Option (-poly (a) (-opt a))] - [List (-lst Univ)] - [Listof -Listof] - [Namespace -Namespace] - [Input-Port -Input-Port] - [Output-Port -Output-Port] - [Bytes -Bytes] - [EOF (-val eof)] - [Keyword -Keyword] - [HashTable (-poly (a b) (-HT a b))] - [Promise (-poly (a) (-Promise a))] - [Pair (-poly (a b) (-pair a b))] - [Boxof (-poly (a) (make-Box a))] - [Syntax Any-Syntax] - [Identifier Ident] - [Procedure (make-Function (list (make-top-arr)))] - ) - -(define-other-types - provide-extra-tnames - require-extra-tnames - - - -> U mu Un All Opaque Vectorof - Parameter Tuple Class Values - ) - -(provide-extra-tnames) diff --git a/collects/typed-scheme/private/env-lang.ss b/collects/typed-scheme/private/env-lang.ss index 32ed0b22..e7285da1 100644 --- a/collects/typed-scheme/private/env-lang.ss +++ b/collects/typed-scheme/private/env-lang.ss @@ -9,6 +9,7 @@ "type-effect-convenience.ss" (only-in "type-effect-convenience.ss" [make-arr* make-arr]) "union.ss")) + (define-syntax (#%module-begin stx) (syntax-case stx (require) [(mb (require . args) [id ty] ...) diff --git a/collects/typed-scheme/private/type-env-lang.ss b/collects/typed-scheme/private/type-env-lang.ss new file mode 100644 index 00000000..314e258c --- /dev/null +++ b/collects/typed-scheme/private/type-env-lang.ss @@ -0,0 +1,41 @@ +#lang scheme/base + +(require "../utils/utils.ss") + +(require (for-syntax (private type-effect-convenience) + (env init-envs) + scheme/base + (except-in (rep effect-rep type-rep) make-arr) + (except-in "../rep/type-rep.ss" make-arr) + "type-effect-convenience.ss" + (only-in "type-effect-convenience.ss" [make-arr* make-arr]) + "union.ss")) + +(define-syntax (#%module-begin stx) + (syntax-case stx (require) + [(mb (require . args) [nm ty] ...) + (begin + (unless (andmap identifier? (syntax->list #'(nm ...))) + (raise-syntax-error #f "not all ids")) + #'(#%plain-module-begin + (begin + (require . args) + (define-syntax nm (lambda (stx) (raise-syntax-error 'type-check "type name used out of context" stx))) ... + (provide nm) ... + ;(define-syntax provider (lambda (stx) #'(begin (provide nm) ...))) + ;(provide provider) + (begin-for-syntax + ;(printf "running base-types~n") + (initialize-type-name-env + (list (list #'nm ty) ...))))))] + [(mb . rest) + #'(mb (require) . rest)])) + +(provide #%module-begin + require + (all-from-out scheme/base) + (for-syntax + (all-from-out scheme/base + "type-effect-convenience.ss" + "../rep/type-rep.ss" + "union.ss"))) \ No newline at end of file diff --git a/collects/typed-scheme/typed-scheme.ss b/collects/typed-scheme/typed-scheme.ss index 2fcddf54..c5054fce 100644 --- a/collects/typed-scheme/typed-scheme.ss +++ b/collects/typed-scheme/typed-scheme.ss @@ -17,11 +17,7 @@ syntax/kerncase scheme/match)) -(provide-tnames) -(provide-extra-tnames) -(require-extra-tnames "private/base-types.ss") -(provide (rename-out [All ∀] - [mu Rec])) + (provide (rename-out [module-begin #%module-begin]