~ chicken-core (chicken-5) dd46f2348c2c8f86e5358a6e376483bdb7690446


commit dd46f2348c2c8f86e5358a6e376483bdb7690446
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Sat Nov 10 14:10:56 2012 +0100
Commit:     Peter Bex <peter.bex@xs4all.nl>
CommitDate: Sat Nov 10 18:33:42 2012 +0100

    Improve type-matching for list-like types.
    
    canonicalization of list-like types uses "(list ...)" where
    appropriate to allow more precise type-matching of combinations
    of "list-of"/"list" types.
    
    Signed-off-by: Peter Bex <peter.bex@xs4all.nl>

diff --git a/compiler-namespace.scm b/compiler-namespace.scm
index 69302063..db1c1b64 100644
--- a/compiler-namespace.scm
+++ b/compiler-namespace.scm
@@ -43,7 +43,7 @@
  c-ify-string
  callback-names
  call-info
- canonicalize-list-of-type
+ canonicalize-list-type
  canonicalize-begin-body
  canonicalize-expression
  check-and-open-input-file
diff --git a/scrutinizer.scm b/scrutinizer.scm
index 73a1166b..ca78882a 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -1150,7 +1150,7 @@
 		(pair? t2)
 		(case (car t2)
 		  ((list-of)
-		   (let ((ct1 (canonicalize-list-of-type t1)))
+		   (let ((ct1 (canonicalize-list-type t1)))
 		     (if ct1
 			 (match1 ct1 t2)
 			 #t)))		; inexact match
@@ -1165,7 +1165,7 @@
 	   (and (pair? t1)
 		(case (car t1)
 		  ((list-of)
-		   (let ((ct2 (canonicalize-list-of-type t2)))
+		   (let ((ct2 (canonicalize-list-type t2)))
 		     (if ct2
 			 (match1 t1 ct2)
 			 (and (not exact) (not all)))))	; inexact mode: ok
@@ -1188,7 +1188,7 @@
 			  #t
 			  (lambda (t) (match1 t1 t)))))
 		      ((pair)
-		       (let ((ct2 (canonicalize-list-of-type t2)))
+		       (let ((ct2 (canonicalize-list-type t2)))
 			 (and ct2 (match1 t1 ct2))))
 		      (else #f)))))
 	  ((and (pair? t1) (eq? 'list (car t1)))
@@ -1213,7 +1213,7 @@
 		(or (eq? 'null t1)
 		    (and (pair? t1)
 			 (eq? 'pair (car t1)) ; list-of already handled above
-			 (let ((ct1 (canonicalize-list-of-type t1)))
+			 (let ((ct1 (canonicalize-list-type t1)))
 			   (and ct1 (match1 ct1 t2)))))))
 	  ((and (pair? t2) (eq? 'list (car t2)))
 	   (and (pair? t1)
@@ -1369,7 +1369,7 @@
 		     (if (and (eq? '* tcar) (eq? '* tcdr))
 			 'pair
 			 (let ((t `(pair ,tcar ,tcdr)))
-			   (or (canonicalize-list-of-type t)
+			   (or (canonicalize-list-type t)
 			       t)))))
 		  ((vector-of)
 		   (let ((t2 (simplify (second t))))
@@ -2180,26 +2180,24 @@
 ;
 ; - returns #f if not possibly matchable with "list-of"
 
-(define (canonicalize-list-of-type t)
+(define (canonicalize-list-type t)
   (cond ((not (pair? t)) t)
 	((eq? 'pair (car t))
 	 (let ((tcar (second t))
 	       (tcdr (third t)))
 	   (let rec ((tr tcdr) (ts (list tcar)))
 	     (cond ((eq? 'null tr)
-		    `(list-of ,(simplify-type `(or ,@ts))))
+		    `(list ,@(reverse ts)))
 		   ((eq? 'list tr) tr)
 		   ((and (pair? tr) (eq? 'pair (first tr)))
 		    (rec (third tr) (cons (second tr) ts)))
 		   ((and (pair? tr) (eq? 'list (first tr)))
-		    `(list-of ,(simplify-type `(or ,@ts ,@(cdr tr)))))
+		    `(list ,@(reverse ts) ,@(cdr tr)))
 		   ((and (pair? tr) (eq? 'list-of (first tr)))
-		    `(list-of 
+		    `(list-of
 		      ,(simplify-type
 			`(or ,@(reverse ts) ,@(cdr tr)))))
 		   (else #f)))))
-	((eq? 'list (car t)) 
-	 `(list-of ,(simplify-type `(or ,@(cdr t)))))
 	(else t)))
 
 
Trap