~ chicken-core (chicken-5) 225fdfc473ce834cdc76dbc184c018ff6196c45c
commit 225fdfc473ce834cdc76dbc184c018ff6196c45c Author: felix <felix@call-with-current-continuation.org> AuthorDate: Wed Apr 6 06:26:06 2011 -0400 Commit: felix <felix@call-with-current-continuation.org> CommitDate: Wed Apr 6 06:26:06 2011 -0400 more specialization match tweaking diff --git a/scrutinizer.scm b/scrutinizer.scm index 3d9f148c..005d3419 100755 --- a/scrutinizer.scm +++ b/scrutinizer.scm @@ -832,28 +832,31 @@ (cond ((eq? st t)) ((pair? st) (case (car st) - ((not) - (cond ((and (pair? t) (eq? 'or (car t))) - (not (any (cute match (cadr st) <>) (cdr t)))) - ((eq? '* t) #f) - (else (not (match (cadr st) t))))) + ((not) (matchnot (cadr st) t)) ((or) (any (cut match <> t) (cdr st))) ((and) (every (cut match <> t) (cdr st))) + ((procedure) (bomb "match-specialization: invalid complex procedure type" st)) (else (equal? st t)))) ((eq? st '*)) - ((eq? st 'list) (match '(or null pair) t)) - ((eq? st 'number) (match '(or fixnum float) t)) - ((eq? t 'list) (match st '(or null pair))) - ((eq? t 'number) (match st '(or fixnum float))) - ((eq? st 'procedure) - (or (eq? t 'procedure) - (and (pair? t) (eq? 'procedure (car t))))) ; doesn't match argument/result types + ((eq? st 'list) (eq? t 'list)) + ((eq? st 'number) (eq? t 'number)) ((pair? t) (case (car t) - ((or) (every (cut match st <>) (cdr t))) ; must match every option - ((and) #f) ; should not happen... + ((or) (any (cut match st <>) (cdr t))) + ((and) (every (cut match st <>) (cdr t))) + ((procedure) (match st 'procedure)) + ;; (not ...) should not occur (else (equal? st t)))) (else (equal? st t)))) + (define (matchnot st t) + (cond ((eq? 'list t) (matchnot st '(or null pair))) + ((eq? '* t) #f) + ((pair? t) + (case (car t) + ((or) (every (cut matchnot st <>) (cdr t))) + ((and) (any (cut matchnot st <>) (cdr t))) + (else (not (match st t))))) + (else (not (match st t))))) (let loop ((tl typelist) (atypes atypes)) (cond ((null? tl) (null? atypes)) ((null? atypes) #f)Trap