diff --git a/racket/collects/racket/private/define-struct.rkt b/racket/collects/racket/private/define-struct.rkt index 938c2ae1c8..b86ee0ee45 100644 --- a/racket/collects/racket/private/define-struct.rkt +++ b/racket/collects/racket/private/define-struct.rkt @@ -101,6 +101,19 @@ (lambda (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) (when what (unless (struct-type? what) @@ -617,14 +630,7 @@ (define-values (#,struct: #,make- #,? #,@sels #,@sets) (let-values ([(struct: make- ? -ref -set!) (syntax-parameterize ([struct-field-index - (lambda (stx) - (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-field-index (quote-syntax #,(map field-id fields)))]) (make-struct-type #,reflect-name-expr #,super-struct: #,(- (length fields) auto-count)