diff --git a/racket/collects/racket/private/unit-compiletime.rkt b/racket/collects/racket/private/unit-compiletime.rkt index 8de0501209..25d4e0cb4c 100644 --- a/racket/collects/racket/private/unit-compiletime.rkt +++ b/racket/collects/racket/private/unit-compiletime.rkt @@ -575,16 +575,16 @@ #`(tag #,(link-record-tag lr) #,(link-record-linkid lr)) (link-record-linkid lr))) -(define (make-id-mappers . unbox-stxes) - (apply values (map make-id-mapper unbox-stxes))) +(define (make-id-mappers . make-unbox-stxes) + (apply values (map make-id-mapper make-unbox-stxes))) -(define (make-id-mapper unbox-stx) +(define (make-id-mapper make-unbox-stx) (make-set!-transformer (lambda (sstx) (syntax-case sstx (set!) [x (identifier? #'x) - unbox-stx] + (make-unbox-stx sstx)] [(set! . x) (raise-syntax-error 'unit @@ -593,7 +593,7 @@ [(_ . x) (datum->syntax sstx - (cons unbox-stx #'x) + (cons (make-unbox-stx sstx) #'x) sstx)])))) ;; This utility function returns a list of natural numbers for use as a syntax diff --git a/racket/collects/racket/unit.rkt b/racket/collects/racket/unit.rkt index 869d332ae5..5d96bf77be 100644 --- a/racket/collects/racket/unit.rkt +++ b/racket/collects/racket/unit.rkt @@ -892,19 +892,26 @@ (cons (car x) (signature-siginfo (lookup-signature (cdr x))))) -(define-for-syntax (make-import-unboxing var renamings loc ctc) +(define-for-syntax (make-import-make-unboxing var renamings loc ctc) (if ctc (with-syntax ([ctc-stx (syntax-property ctc 'inferred-name var)]) (quasisyntax/loc (error-syntax) - (quote-syntax (let ([v/c (#,loc)]) - (if (pair? v/c) - (contract (let-syntax #,renamings ctc-stx) (car v/c) (cdr v/c) - (current-contract-region) - (quote #,var) (quote-srcloc #,var)) - (error 'unit "contracted import ~a used before definition" - (quote #,(syntax->datum var)))))))) + (lambda (stx) + (with-syntax ([app (datum->syntax (quote-syntax here) + (list (quote-syntax #,loc)) + stx)]) + (syntax (let ([v/c app]) + (if (pair? v/c) + (contract (let-syntax #,renamings ctc-stx) (car v/c) (cdr v/c) + (current-contract-region) + (quote #,var) (quote-srcloc #,var)) + (error 'unit "contracted import ~a used before definition" + (quote #,(syntax->datum var)))))))))) (quasisyntax/loc (error-syntax) - (quote-syntax (#,loc))))) + (lambda (stx) + (datum->syntax (quote-syntax here) + (list (quote-syntax #,loc)) + stx))))) ;; build-unit : syntax-object -> ;; (values syntax-object (listof identifier) (listof identifier)) @@ -1009,7 +1016,7 @@ [#,ivs (make-id-mappers #,@(map (lambda (iv l c) - (make-import-unboxing iv #'renamings l c)) + (make-import-make-unboxing iv #'renamings l c)) (syntax->list ivs) (syntax->list ils) ics))]))) @@ -1191,7 +1198,7 @@ tmp))) #,(quasisyntax/loc defn-or-expr (define-syntax #,id - (make-id-mapper (quote-syntax #,tmp))))) + (make-id-mapper (lambda (stx) (quote-syntax #,tmp)))))) (and ctc #`(contract #,ctc #,tmp (current-contract-region)