diff --git a/collects/redex/private/enum.rkt b/collects/redex/private/enum.rkt index eef1fc58da..a863055e31 100644 --- a/collects/redex/private/enum.rkt +++ b/collects/redex/private/enum.rkt @@ -89,9 +89,9 @@ (rec p2))] [`(hide-hole ,p) (rec p)] [`(side-condition ,p ,g ,e) ;; error - (error 'unsupported "side-condition")] + (unsupported/enum pat)] [`(cross ,s) - (error 'unsupported "cross")] ;; error + (unsupported/enum pat)] ;; error [`(list ,sub-pats ...) (ormap (λ (sub-pat) (match sub-pat @@ -128,9 +128,9 @@ (rec p2))] [`(hide-hole ,p) (rec p)] [`(side-condition ,p ,g ,e) ;; error - (error 'no-enum "side-condition")] + (rec p)] [`(cross ,s) - (error 'no-enum "cross")] ;; error + (unsupported/enum pat)] ;; error [`(list ,sub-pats ...) (ormap (λ (sub-pat) (match sub-pat @@ -201,9 +201,9 @@ (loop p1 named-pats))] [`(hide-hole ,p) (loop p named-pats)] [`(side-condition ,p ,g ,e) ;; error - (error 'no-enum "side condition")] + (unsupported/enum pat)] [`(cross ,s) - (error 'no-enum "cross")] ;; error + (unsupported/enum pat)] ;; error [`(list ,sub-pats ...) (foldl (λ (sub-pat named-pats) (match sub-pat @@ -251,12 +251,12 @@ (car named-pats) ;; named repeat [`(,name name-r) - (error 'unimplemented "named-repeat")] + (error/enum 'unimplemented "named-repeat")] ;; mismatch repeat [`(,name mismatch-r) - (error 'unimplemented "mismatch-repeat")] + (error/enum 'unimplemented "mismatch-repeat")] [`(,name ,pat mismatch) - (error 'unimplemented "mismatch")] + (error/enum 'unimplemented "mismatch")] ;; named [`(,name ,pat) (map/enum ;; loses bijection @@ -290,12 +290,12 @@ [`variable var/enum] [`(variable-except ,s ...) ;; todo - (error 'unimplemented "var-except")] + (error/enum 'unimplemented "var-except")] [`(variable-prefix ,s) ;; todo - (error 'unimplemented "var-prefix")] + (error/enum 'unimplemented "var-prefix")] [`variable-not-otherwise-mentioned - (error 'unimplemented "var-not-mentioned")] ;; error + (error/enum 'unimplemented "var-not-mentioned")] ;; error [`hole (const/enum 'hole)] [`(nt ,id) @@ -303,7 +303,7 @@ [`(name ,name ,pat) (const/enum (hash-ref named-terms name))] [`(mismatch-name ,name ,pat) - (error 'unimplemented "mismatch-name")] + (error/enum 'unimplemented "mismatch-name")] [`(in-hole ,p1 ,p2) ;; untested (map/enum (λ (t1-t2) ;; loses bijection @@ -317,9 +317,9 @@ [`(hide-hole ,p) (loop p)] [`(side-condition ,p ,g ,e) - (error 'no-enum "side condition")] + (unsupported/enum pat)] [`(cross ,s) - (error 'no-enum "cross")] + (unsupported/enum pat)] [`(list ,sub-pats ...) ;; enum-list (map/enum @@ -341,9 +341,9 @@ (list/enum (build-list n (const (loop pat)))))))] [`(repeat ,pat ,name #f) - (error 'unimplemented "named-repeat")] + (error/enum 'unimplemented "named-repeat")] [`(repeat ,pat #f ,mismatch) - (error 'unimplemented "mismatch-repeat")] + (error/enum 'unimplemented "mismatch-repeat")] [else (loop sub-pat)])) sub-pats)))] [(? (compose not pair?)) @@ -365,12 +365,12 @@ [`variable var/enum] [`(variable-except ,s ...) ;; todo - (error 'unimplemented "var except")] + (error/enum 'unimplemented "var except")] [`(variable-prefix ,s) ;; todo - (error 'unimplemented "var prefix")] + (error/enum 'unimplemented "var prefix")] [`variable-not-otherwise-mentioned - (error 'unimplemented "var not otherwise mentioned")] + (error/enum 'unimplemented "var not otherwise mentioned")] [`hole (const/enum 'hole)] [`(nt ,id) @@ -393,7 +393,7 @@ [`(name ,name ,pat) (const/enum (hash-ref named-terms name))] [`(mismatch-name ,name ,pat) - (error 'unimplemented "mismatch-name")] + (error/enum 'unimplemented "mismatch-name")] [`(in-hole ,p1 ,p2) ;; untested (map/enum (λ (t1-t2) @@ -409,9 +409,9 @@ ;; todo (loop p)] [`(side-condition ,p ,g ,e) - (error 'no-enum "side-condition")] + (unsupported/enum pat)] [`(cross ,s) - (error 'no-enum "cross")] + (unsupported/enum pat)] [`(list ,sub-pats ...) ;; enum-list (map/enum @@ -433,9 +433,9 @@ (list/enum (build-list n (const (loop pat)))))))] [`(repeat ,pat ,name #f) - (error 'unimplemented "named-repeat")] + (error/enum 'unimplemented "named-repeat")] [`(repeat ,pat #f ,mismatch) - (error 'unimplemented "mismatch-repeat")] + (error/enum 'unimplemented "mismatch-repeat")] [else (loop sub-pat)])) sub-pats)))] [(? (compose not pair?)) diff --git a/collects/redex/private/enumerator.rkt b/collects/redex/private/enumerator.rkt index 38fed5534b..4b9d0f921d 100644 --- a/collects/redex/private/enumerator.rkt +++ b/collects/redex/private/enumerator.rkt @@ -31,7 +31,10 @@ nats range/enum - nats+/enum) + nats+/enum + + error/enum + unsupported/enum) ;; an enum a is a struct of < Nat or +Inf, Nat -> a, a -> Nat > (struct enum @@ -565,6 +568,14 @@ t t))) +(define (error/enum . args) + (define (fail n) (apply error args)) + (enum +inf.0 fail fail)) + +(define (unsupported/enum pat) + (error/enum 'generate-term "#:i-th does not support ~s patterns" pat)) + + (module+ test (require rackunit)