diff --git a/pkgs/redex-pkgs/redex-lib/redex/private/judgment-form.rkt b/pkgs/redex-pkgs/redex-lib/redex/private/judgment-form.rkt index b69f327347..b4a6eb957c 100644 --- a/pkgs/redex-pkgs/redex-lib/redex/private/judgment-form.rkt +++ b/pkgs/redex-pkgs/redex-lib/redex/private/judgment-form.rkt @@ -9,7 +9,9 @@ racket/stxparam "term-fn.rkt" "rewrite-side-conditions.rkt" - (prefix-in pu: "pat-unify.rkt")) + (only-in "pat-unify.rkt" + unsupported-pat-err-name + unsupported-pat-err)) (require (for-syntax "rewrite-side-conditions.rkt" @@ -1534,14 +1536,12 @@ (values (syntax->list #'(body-pat ...)) (maybe-rev (syntax->list #'((prem mf-clauses '(list args-pat res-pat)) ... ...)))))) -(define unsupported-pat-err-name (make-parameter #f)) - (define-for-syntax (check-pats stx) (cond [(has-unsupported-pat? stx) => (λ (bad-stx) - #`(error (unsupported-pat-err-name) "generation failed at unsupported pattern: ~s" #,bad-stx))] + #`(unsupported-pat-err #,bad-stx))] [else stx])) diff --git a/pkgs/redex-pkgs/redex-lib/redex/private/pat-unify.rkt b/pkgs/redex-pkgs/redex-lib/redex/private/pat-unify.rkt index bf2d8e3f53..996e154293 100644 --- a/pkgs/redex-pkgs/redex-lib/redex/private/pat-unify.rkt +++ b/pkgs/redex-pkgs/redex-lib/redex/private/pat-unify.rkt @@ -11,6 +11,7 @@ "lang-struct.rkt" "extract-conditions.rkt" "enum.rkt" + "error.rkt" (for-syntax "rewrite-side-conditions.rkt" racket/base) unstable/2d/match) @@ -37,7 +38,9 @@ unique-name-nums fresh-pat-vars make-uid - p*e-eqs) + p*e-eqs + unsupported-pat-err-name + unsupported-pat-err) ;; @@ -849,7 +852,19 @@ (hash-set! memo (list nt clang npat) pat-ok?) pat-ok?))))) +(define unsupported-pat-err-name (make-parameter #f)) + +(define (unsupported-pat-err pat) + (unless (unsupported-pat-err-name) + (redex-error 'unsupported-pat-err-name "not set before derivation generation")) + (redex-error (unsupported-pat-err-name) + (string-append "generation failed at unsupported pattern;\n" + " (#:satisfying keyword does not support ellipses, contexts, side-conditions, or unquote)\n" + " pattern: ~a") + pat)) + (define (normalize-pat lang pat) + (define err unsupported-pat-err) (let loop ([pat pat]) (match-a-pattern #:allow-else pat [`any pat] @@ -863,7 +878,7 @@ [`(variable-except ,s ...) `variable] [`(variable-prefix ,s) `variable] [`variable-not-otherwise-mentioned pat] - [`hole (error 'normalize-pat "can't normalize pattern: ~s" pat)] + [`hole (err pat)] [`(nt ,id) (loop (hash-ref (compiled-lang-collapsible-nts lang) id 'any))] [`(name ,name ,npat) @@ -871,16 +886,16 @@ `any `(name ,name ,(loop npat)))] [`(mismatch-name ,name ,pat) (loop pat)] - [`(in-hole ,p1 ,p2) (error 'normalize-pat "can't normalize pattern: ~s" pat)] + [`(in-hole ,p1 ,p2) (err pat)] [`(hide-hole ,p) (loop p)] [`(side-condition ,p ,g ,e) - (error 'normalize-pat "can't normalize pattern: ~s" pat)] - [`(cross ,s) (error 'normalize-pat "can't normalize pattern: ~s" pat)] + (err pat)] + [`(cross ,s) (err pat)] [`(list ,sub-pats ...) `(list ,@(for/list ([sub-pat (in-list sub-pats)]) (match sub-pat [`(repeat ,pat ,name ,mismatch) - (error 'normalize-pat "can't normalize pattern: ~s" sub-pat)] + (err sub-pat)] [_ (loop sub-pat)])))] [(? (compose not pair?))