Cleaned up define-typed-struct-internal and require/typed.
Also fixed a test for require/typed.
This commit is contained in:
parent
f3692eae29
commit
ecaf5f40a0
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)))
|
||||
|
|
Loading…
Reference in New Issue
Block a user