struct: don't generate excessive struct-field-index
code
The expansion of `struct` created far too much code to parameterize `struct-field-index`, making expansion of a `struct` form with just 100 or 200 fields take a noticeably long time to expand.
This commit is contained in:
parent
00b6803e36
commit
0de88f203d
|
@ -101,6 +101,19 @@
|
||||||
(lambda (stx)
|
(lambda (stx)
|
||||||
(raise-syntax-error #f "allowed only within a structure type definition" stx)))
|
(raise-syntax-error #f "allowed only within a structure type definition" stx)))
|
||||||
|
|
||||||
|
(define-for-syntax (make-struct-field-index fields)
|
||||||
|
(lambda (stx)
|
||||||
|
(syntax-case stx ()
|
||||||
|
[(_ id)
|
||||||
|
(identifier? #'id)
|
||||||
|
(let loop ([pos 0] [fields (syntax->list fields)])
|
||||||
|
(cond
|
||||||
|
[(null? fields)
|
||||||
|
(raise-syntax-error #f "no such field" stx #'name)]
|
||||||
|
[(free-identifier=? #'id (car fields))
|
||||||
|
(datum->syntax #'here pos stx)]
|
||||||
|
[else (loop (add1 pos) (cdr fields))]))])))
|
||||||
|
|
||||||
(define (check-struct-type name what)
|
(define (check-struct-type name what)
|
||||||
(when what
|
(when what
|
||||||
(unless (struct-type? what)
|
(unless (struct-type? what)
|
||||||
|
@ -617,14 +630,7 @@
|
||||||
(define-values (#,struct: #,make- #,? #,@sels #,@sets)
|
(define-values (#,struct: #,make- #,? #,@sels #,@sets)
|
||||||
(let-values ([(struct: make- ? -ref -set!)
|
(let-values ([(struct: make- ? -ref -set!)
|
||||||
(syntax-parameterize ([struct-field-index
|
(syntax-parameterize ([struct-field-index
|
||||||
(lambda (stx)
|
(make-struct-field-index (quote-syntax #,(map field-id fields)))])
|
||||||
(syntax-case stx #,(map field-id fields)
|
|
||||||
#,@(let loop ([fields fields][pos 0])
|
|
||||||
(cond
|
|
||||||
[(null? fields) null]
|
|
||||||
[else (cons #`[(_ #,(field-id (car fields))) #'#,pos]
|
|
||||||
(loop (cdr fields) (add1 pos)))]))
|
|
||||||
[(_ name) (raise-syntax-error #f "no such field" stx #'name)]))])
|
|
||||||
(make-struct-type #,reflect-name-expr
|
(make-struct-type #,reflect-name-expr
|
||||||
#,super-struct:
|
#,super-struct:
|
||||||
#,(- (length fields) auto-count)
|
#,(- (length fields) auto-count)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user