diff --git a/racket/collects/racket/contract/private/arr-i-parse.rkt b/racket/collects/racket/contract/private/arr-i-parse.rkt index d88942fc2d..7eabb799c1 100644 --- a/racket/collects/racket/contract/private/arr-i-parse.rkt +++ b/racket/collects/racket/contract/private/arr-i-parse.rkt @@ -5,7 +5,8 @@ ;; has these old, wrong names in it. [make-module-identifier-mapping make-free-identifier-mapping] [module-identifier-mapping-get free-identifier-mapping-get] - [module-identifier-mapping-put! free-identifier-mapping-put!]) + [module-identifier-mapping-put! free-identifier-mapping-put!] + [module-identifier-mapping-for-each free-identifier-mapping-for-each]) "application-arity-checking.rkt" "arr-util.rkt" (for-template racket/base @@ -100,8 +101,41 @@ code does the parsing and validation of the syntax. (define (ensure-bound vars) (for ([var (in-list vars)]) (unless (free-identifier-mapping-get nm var (λ () #f)) - (raise-syntax-error #f "dependent variable not bound" - stx var)))) + (define vars '()) + (free-identifier-mapping-for-each + nm + (λ (id _) + (define sym (syntax-e id)) + (unless (member sym vars) + (set! vars (cons sym vars))))) + + (define (insert x l) + (cond + [(null? l) (list x)] + [else + (cond + [(symboli expression" + "\n variables:" + (for/list ([var (in-list sorted-vars)] + [i (in-naturals)]) + (format " ~a" var))) + stx var)))) ;; not-range-bound : (listof identifier[used-by-an-arg]) -> void (define (not-range-bound arg-vars arg?)