add check-redundancy, a parameter that causes redex to print some

debugging information about ambiguous matching (when the ambiguity
matters)
This commit is contained in:
Robby Findler 2012-01-09 12:55:57 -06:00
parent a12df9cea6
commit 6cacd57ebc
3 changed files with 29 additions and 4 deletions

View File

@ -1624,7 +1624,18 @@ See match-a-pattern.rkt for more details
[(null? rhss)
(if (null? ans)
#f
ans)]
(begin
(when (check-redudancy)
(let ([rd (remove-duplicates ans)])
(unless (= (length rd) (length ans))
(eprintf "found redundancy when matching the non-terminal ~s against:\n~s~a"
nt
term
(apply
string-append
(map (λ (x) (format "\n ~s" x))
ans))))))
ans))]
[else
(let ([mth (call-nt-proc/bindings (car rhss) term hole-info)])
(cond
@ -1644,6 +1655,8 @@ See match-a-pattern.rkt for more details
(or (call-nt-proc/bindings (car rhss) term hole-info)
(loop (cdr rhss)))]))))
(define check-redudancy (make-parameter #f))
(define (match-nt/boolean list-rhs non-list-rhs nt term)
(let loop ([rhss (if (or (null? term) (pair? term))
list-rhs
@ -1956,4 +1969,5 @@ See match-a-pattern.rkt for more details
the-not-hole the-hole hole?
rewrite-ellipses
build-compatible-context-language
caching-enabled?)
caching-enabled?
check-redudancy)

View File

@ -389,7 +389,17 @@ nested lists.
}
@defproc[(set-cache-size! [size positive-integer?]) void?]{
Changes the size of the per-pattern and per-metafunction caches. The default size is @racket[350].
Changes the size of the per-pattern and per-metafunction caches.
The default size is @racket[350].
}
@defparam[check-redudancy check? boolean?]{
Ambiguous patterns can slow down
Redex's pattern matching implementation significantly. To help debug
such performance issues, set the @racket[check-redundancy]
parameter to @racket[#t]. This causes Redex to, at runtime,
report any redundant matches that it encounters.
}
@section{Terms}

View File

@ -33,7 +33,8 @@
judgment-holds
in-domain?
caching-enabled?
make-coverage)
make-coverage
check-redudancy)
(provide (rename-out [test-match redex-match])
term-match