diff --git a/collects/tests/typed-racket/succeed/define-type-omit-define.rkt b/collects/tests/typed-racket/succeed/define-type-omit-define.rkt new file mode 100644 index 00000000..4b135526 --- /dev/null +++ b/collects/tests/typed-racket/succeed/define-type-omit-define.rkt @@ -0,0 +1,9 @@ +#lang typed/racket + +(define-syntax (x stx) #'5) + +(define-type x Number #:omit-define-syntaxes) + +(ann 7 x) + +(add1 x) diff --git a/collects/typed-racket/base-env/prims.rkt b/collects/typed-racket/base-env/prims.rkt index 9548b17f..0accc4b3 100644 --- a/collects/typed-racket/base-env/prims.rkt +++ b/collects/typed-racket/base-env/prims.rkt @@ -450,9 +450,13 @@ This file defines two sorts of primitives. All of them are provided into any mod (define-syntax (define-type-alias stx) (syntax-parse stx - [(_ tname:id rest) + [(_ tname:id rest (~optional (~and omit #:omit-define-syntaxes) + #:defaults + ([omit #f]))) #`(begin - #,(ignore #'(define-syntax tname (lambda (stx) (raise-syntax-error 'type-check "type name used out of context" stx)))) + #,(if (not (attribute omit)) + (ignore #'(define-syntax tname (lambda (stx) (raise-syntax-error 'type-check "type name used out of context" stx)))) + #'(begin)) #,(internal (syntax/loc stx (define-type-alias-internal tname rest))))] [(_ (tname:id args:id ...) rest) (syntax/loc stx (define-type-alias tname (All (args ...) rest)))])) diff --git a/collects/typed-racket/scribblings/reference/special-forms.scrbl b/collects/typed-racket/scribblings/reference/special-forms.scrbl index aab139ce..56e6bb57 100644 --- a/collects/typed-racket/scribblings/reference/special-forms.scrbl +++ b/collects/typed-racket/scribblings/reference/special-forms.scrbl @@ -285,8 +285,10 @@ corresponding to @racket[define-struct].} The procdure @racket[e] is used as the value for @racket[prop:procedure], and must have type @racket[proc-t].} @section{Names for Types} -@defform*[[(define-type name t) - (define-type (name v ...) t)]]{ +@defform*[[(define-type name t maybe-omit-def) + (define-type (name v ...) t maybe-omit-def)] + #:grammar + [(maybe-omit-def (code:line #:omit-define-syntaxes) (code:line))]]{ The first form defines @racket[name] as type, with the same meaning as @racket[t]. The second form is equivalent to @racket[(define-type name (All (v ...) t))]. Type names may @@ -294,7 +296,11 @@ refer to other types defined in the same module, but cycles among them are prohibited. @ex[(define-type IntStr (U Integer String)) - (define-type (ListofPairs A) (Listof (Pair A A)))]} + (define-type (ListofPairs A) (Listof (Pair A A)))] + +If @racket[#:omit-define-syntaxes] is specified, no definition of +@racket[name] is created. In this case, some other definition of @racket[name] +is necessary.} @section{Generating Predicates Automatically}