diff --git a/collects/tests/typed-scheme/succeed/require-struct.rkt b/collects/tests/typed-scheme/succeed/require-struct.rkt index 234f722a..ebede62d 100644 --- a/collects/tests/typed-scheme/succeed/require-struct.rkt +++ b/collects/tests/typed-scheme/succeed/require-struct.rkt @@ -12,20 +12,20 @@ (module typed typed/racket (require/typed 'untyped (struct a ((v : Integer))) - #;(struct (b a) ((v : String))) + (struct (b a) ((v : String))) (struct c ((v : Integer)) #:constructor-name c-maker) - #;(struct (d c) ((v : String)) #:constructor-name d-maker) + (struct (d c) ((v : String)) #:constructor-name d-maker) (struct e ((v : Integer)) #:extra-constructor-name make-e) - #;(struct (f e) ((v : String)) #:extra-constructor-name make-f)) + (struct (f e) ((v : String)) #:extra-constructor-name make-f)) (a 0) - ;(b 1 "2") + (b 1 "2") (c-maker 3) - ;(d-maker 4 "5") + (d-maker 4 "5") (make-e 6) - ;(make-f 7 "8") + (make-f 7 "8") (e 9) - #;(f 10 "11")) + (f 10 "11")) (require 'typed) diff --git a/collects/typed-scheme/base-env/prims.rkt b/collects/typed-scheme/base-env/prims.rkt index e70264c3..96267447 100644 --- a/collects/typed-scheme/base-env/prims.rkt +++ b/collects/typed-scheme/base-env/prims.rkt @@ -419,10 +419,9 @@ This file defines two sorts of primitives. All of them are provided into any mod (syntax-parse stx #:literals (:) [(_ name:opt-parent ([fld : ty] ...) input-maker:constructor-term lib) - (define has-parent? (and (syntax-e #'name.parent) #t)) (with-syntax* ([nm #'name.nm] [parent #'name.parent] - [spec (if has-parent? #'(nm parent) #'nm)] + [spec (if (syntax-e #'name.parent) #'(nm parent) #'nm)] [(struct-info _ pred sel ...) (build-struct-names #'nm (syntax->list #'(fld ...)) #f #t)] [(mut ...) (map (lambda _ #'#f) (syntax->list #'(sel ...)))] [maker-name (if (syntax-e #'input-maker.name) #'input-maker.name #'nm)] ;New default (corresponds to how struct works) diff --git a/collects/typed-scheme/typecheck/tc-toplevel.rkt b/collects/typed-scheme/typecheck/tc-toplevel.rkt index b658ac06..4d0e25f4 100644 --- a/collects/typed-scheme/typecheck/tc-toplevel.rkt +++ b/collects/typed-scheme/typecheck/tc-toplevel.rkt @@ -33,6 +33,17 @@ (define unann-defs (make-free-id-table)) +(define-splicing-syntax-class dtsi-fields + #:attributes (mutable type-only maker constructor-return predicate) + (pattern + (~seq + (~or (~optional (~and #:mutable (~bind (mutable #t)))) + (~optional (~and #:type-only (~bind (type-only #t)))) + (~optional (~seq #:maker maker)) + (~optional (~seq #:predicate predicate)) + (~optional (~seq #:constructor-return constructor-return))) ...))) + + (define (tc-toplevel/pass1 form) (parameterize ([current-orig-stx form]) (syntax-parse form @@ -82,43 +93,20 @@ (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)))] [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) #:mutable)) (#%plain-app values))) (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) #:mutable #t)] - [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) - #:maker m #:constructor-return t #:predicate p)) - (#%plain-app values))) + + [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) fields:dtsi-fields)) (#%plain-app values))) (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) - #:maker #'m #:constructor-return #'t #:predicate #'p)] - [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) - #:maker m #:constructor-return t)) - (#%plain-app values))) - (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) - #:maker #'m #:constructor-return #'t)] - [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) - #:maker m)) - (#%plain-app values))) - (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) - #:maker #'m)] - [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) - #:maker m #:mutable)) - (#%plain-app values))) - (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) - #:maker #'m #:mutable #t)] - [(define-values () (begin (quote-syntax (define-typed-struct-internal (vars ...) nm ([fld : ty] ...) - #:maker m)) - (#%plain-app values))) - (tc/poly-struct (syntax->list #'(vars ...)) #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) - #:maker #'m)] - [(define-values () (begin (quote-syntax (define-typed-struct-internal (vars ...) nm ([fld : ty] ...) - #:maker m #:mutable)) - (#%plain-app values))) - (tc/poly-struct (syntax->list #'(vars ...)) #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) - #:maker #'m #:mutable #t)] - [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) #:type-only)) - (#%plain-app values))) - (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) #:type-only #t)] - [(define-values () (begin (quote-syntax (define-typed-struct-internal nm ([fld : ty] ...) #:maker m #:type-only)) - (#%plain-app values))) - (tc/struct #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) #:maker #'m #:type-only #t)] + #:mutable (attribute fields.mutable) + #:maker (attribute fields.maker) + #:constructor-return (attribute fields.constructor-return) + #:predicate (attribute fields.predicate) + #:type-only (attribute fields.type-only))] + ;; define-typed-struct w/ polymorphism + [(define-values () (begin (quote-syntax (define-typed-struct-internal (vars ...) nm ([fld : ty] ...) #:maker m)) (#%plain-app values))) + (tc/poly-struct (syntax->list #'(vars ...)) #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) #:maker #'m)] + [(define-values () (begin (quote-syntax (define-typed-struct-internal (vars ...) nm ([fld : ty] ...) #:maker m #:mutable)) (#%plain-app values))) + (tc/poly-struct (syntax->list #'(vars ...)) #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) #:maker #'m #:mutable #t)] [(define-values () (begin (quote-syntax (define-typed-struct-internal (vars ...) nm ([fld : ty] ...) #:mutable)) (#%plain-app values))) (tc/poly-struct (syntax->list #'(vars ...)) #'nm (syntax->list #'(fld ...)) (syntax->list #'(ty ...)) #:mutable #t)] [(define-values () (begin (quote-syntax (define-typed-struct-internal (vars ...) nm ([fld : ty] ...))) (#%plain-app values)))