chicken-hackers
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Chicken-hackers] [PATCH] sequence type corrections and enhancements


From: Felix
Subject: [Chicken-hackers] [PATCH] sequence type corrections and enhancements
Date: Sun, 11 Sep 2011 00:26:45 +0200 (CEST)

Hello!


(Patches will from now on be posted on this mailing list and
will require sign-off by other core-developers. For more information
about this, see 

  http://wiki.call-cc.org/development-process

Note that this is still highly experimental. Give us a bit of time
to get used to it before warming up the flame throwers...)


The attached patch implements a correction of the available sequence
type specifiers. Currently "(list T)" and "(vector T)" designate lists
or vectors with an unknown number of elements of the given type. This
is suboptimal, because fixed-length lists/vectors (with possibly
different element types) can not be handled by the flow analysis.

So "(list T)" and "(vector T)" have been renamed to "(list-of T)" and
"(vector-of T)" (which is compatible to the type-syntax of some other
obscure Scheme implementation). "(list T ...)"/"(vector T ...)" now
specify lists/vectors of fixed length with elements of the given
types.

"vector-ref" is hardcoded as a special case, for example:

(let* ((tm (seconds->local-time))
       (xy (cons (vector-ref tm 0) (vector-ref tm 8))))
  ;; "xy" known to be of type "(pair fixnum boolean)"
  ...)

Note that flow-analysis is done before optimization, so only
simple cases of known indices for "vector-ref" are detected
(constant-folding will not help here, as it is done later).

"list-ref" is not currently optimized. This is slightly more
complicated and doesn't seem to be worth it. Vectors on the other hand
are often used as a replacement for records, particularly in pure
standard-compliant code.

Tests have been corrected and added, the "Types" manual chapter
has been updated as well.


cheers,
felix

commit fe80ccfa8ce886c220b699211991c6a81fea50da
Author: felix <address@hidden>
Date:   Sun Sep 11 00:07:43 2011 +0200

    Added support for fixed-size list and vector types, renamed old
    (list T)/(vector T) type specifiers to (list-of T)/(vector-of T).
    types.db was changed so making boot-chicken is needed to build
    this version.
    
    Squashed commit of the following:
    
    commit 9f03791673927e769c1e5a2db8d1cce0e50ed0cb
    Merge: e35329f... 3a2f7e3...
    Author: felix <address@hidden>
    Date:   Sun Sep 11 00:05:03 2011 +0200
    
        resolved conflicts
    
    commit e35329fcdf68f6aecd88c0560268050813276329
    Author: felix <address@hidden>
    Date:   Sat Sep 10 23:58:28 2011 +0200
    
        fixed two bugs in handling of rest arg and simplification of 
list-of/vector-of
    
    commit e228f022e1668d90fed8d3cc8e70c1af15b3393d
    Author: felix <address@hidden>
    Date:   Sat Sep 10 16:24:11 2011 +0200
    
        various bugfixes in the FA and corrections in the tests
    
    commit 81a084216f9f199926ceca4e79d7e0b5305cf456
    Author: felix <address@hidden>
    Date:   Sat Sep 10 02:56:16 2011 +0200
    
        special-case handler also receives argtypes
    
    commit bf2642cb12de6f775ffc1bdd18cea1771a93a120
    Author: felix <address@hidden>
    Date:   Sat Sep 10 02:55:58 2011 +0200
    
        added variant of types.db with new-style sequence types
    
    commit 39768d2c188b5b0037313e5cf297d6b4426da3c0
    Author: felix <address@hidden>
    Date:   Sat Sep 10 02:55:24 2011 +0200
    
        corrected use of old-style list type
    
    commit 7a32bdc84122ccc7a3255777e261db18751ad603
    Author: felix <address@hidden>
    Date:   Fri Sep 9 16:35:32 2011 +0200
    
        renamed vector/list to vector-of/list-of; added support for vector/list

diff --git a/manual/Types b/manual/Types
index 2d7f7dc..710a17b 100644
--- a/manual/Types
+++ b/manual/Types
@@ -137,8 +137,10 @@ or {{:}} should follow the syntax given below:
 <table>
 <tr><th>COMPLEXTYPE</th><th>meaning</th></tr>
 <tr><td>{{(pair TYPE1 TYPE2)}}</td><td>pair with given component 
types</td></tr>
-<tr><td>{{(list TYPE)}}</td><td>proper list with given element type</td></tr>
-<tr><td>{{(vector TYPE)}}</td><td>vector with given element types</td></tr>
+<tr><td>{{(list-of TYPE)}}</td><td>proper list with given element 
type</td></tr>
+<tr><td>{{(list TYPE1 ...)}}</td><td>proper list with given length and element 
types</td></tr>
+<tr><td>{{(vector-of TYPE)}}</td><td>vector with given element types</td></tr>
+<tr><td>{{(vector TYPE1 ...)}}</td><td>vector with given length and element 
types</td></tr>
 </table>
 
 <table>  
@@ -158,7 +160,7 @@ or {{:}} should follow the syntax given below:
 
 Note that type-variables in {{forall}} types may be given "constraint" types, 
i.e.
 
-  (: sort (forall (e (s (or (vector e) (list e))))
+  (: sort (forall (e (s (or (vector e) (list-of e))))
             (s (e e -> *) -> s)))
 
 declares that {{sort}} is a procedure of two arguments, the first
diff --git a/scrutinizer.scm b/scrutinizer.scm
index ce4526c..f32c0dc 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -74,7 +74,11 @@
 ;           procedure | vector | null | eof | undefined | port |
 ;           blob | noreturn | pointer | locative | fixnum | float |
 ;           pointer-vector
-;   COMPLEX = (pair VAL VAL) | (vector VAL) | (list VAL)
+;   COMPLEX = (pair VAL VAL)
+;           | (vector-of VAL) 
+;           | (list-of VAL)
+;           | (vector VAL1 ...)
+;           | (list VAL1 ...)
 ;   RESULTS = * 
 ;           | (VAL1 ...)
 ;   TVAR = (VAR TYPE) | VAR
@@ -134,19 +138,14 @@
            ((boolean? lit) 'boolean)
            ((null? lit) 'null)
            ((list? lit) 
-            (let ((x (constant-result (car lit)))
-                  (r (cdr lit)))
-              (simplify-type
-               (if (null? r)
-                   `(pair ,x null)
-                   `(list (or ,@(map constant-result r)))))))
+            `(list ,@(map constant-result lit)))
            ((pair? lit)
             (simplify-type
              `(pair ,(constant-result (car lit)) ,(constant-result (cdr 
lit)))))
            ((eof-object? lit) 'eof)
            ((vector? lit) 
             (simplify-type
-             `(vector (or ,@(map constant-result (vector->list lit))))))
+             `(vector ,@(map constant-result (vector->list lit)))))
            ((and (not (##sys#immediate? lit)) (##sys#generic-structure? lit))
             `(struct ,(##sys#slot lit 0)))
            ((char? lit) 'char)
@@ -738,7 +737,7 @@
                                                 
'##compiler#special-result-type))
                                           => (lambda (srt)
                                                (dd "  hardcoded special 
result-type: ~a" var)
-                                               (set! r (srt n r))))))))
+                                               (set! r (srt n args r))))))))
                              subs
                              (cons 
                               fn
@@ -780,6 +779,7 @@
                    ;; first exp is always a variable so ts must be of length 1
                    (let loop ((types params) (subs (cdr subs)))
                      (cond ((null? types)
+                            ;;XXX figure out line-number
                             (quit "~ano clause applies in `compiler-typecase' 
for expression of type `~s':~a" 
                                   (location-name loc) (car ts)
                                   (string-concatenate
@@ -826,6 +826,10 @@
               (change! (cute set-cdr! (car lst) <>)))
       (when (pair? t)
        (case (car t)
+         ((pair-of vector-of)
+          (dd "  smashing `~s' in ~a" (caar lst) where)
+          (change! (if (eq? 'pair-of (car t)) 'pair 'vector))
+          (car t))
          ((pair vector)
           (dd "  smashing `~s' in ~a" (caar lst) where)
           (change! (car t))
@@ -896,10 +900,14 @@
               (sprintf "a pair wth car ~a and cdr ~a"
                 (typename (second t))
                 (typename (third t))))
-             ((vector)
+             ((vector-of)
               (sprintf "a vector with element type ~a" (typename (second t))))
-             ((list)
+             ((list-of)
               (sprintf "a list with element type ~a" (typename (second t))))
+             ((vector list)
+              (sprintf "a ~a with the element types ~a"
+                (car t)
+                (map typename (cdr t))))
              (else (bomb "typename: invalid type" t))))
           (else (bomb "typename: invalid type" t))))))
 
@@ -1051,18 +1059,18 @@
                (eq? 'procedure (car t1))))
          ((eq? t1 'pair) (match1 '(pair * *) t2))
          ((eq? t2 'pair) (match1 t1 '(pair * *)))
-         ((eq? t1 'list) (match1 '(list *) t2))
-         ((eq? t2 'list) (match1 t1 '(list *)))
-         ((eq? t1 'vector) (match1 '(vector *) t2))
-         ((eq? t2 'vector) (match1 t1 '(vector *)))
+         ((eq? t1 'list) (match1 '(list-of *) t2))
+         ((eq? t2 'list) (match1 t1 '(list-of *)))
+         ((eq? t1 'vector) (match1 '(vector-of *) t2))
+         ((eq? t2 'vector) (match1 t1 '(vector-of *)))
          ((eq? t1 'null)
           (and (not exact) (not all)
                (or (memq t2 '(null list))
-                   (and (pair? t2) (eq? 'list (car t2))))))
+                   (and (pair? t2) (eq? 'list-of (car t2))))))
          ((eq? t2 'null)
           (and (not exact)
                (or (memq t1 '(null list))
-                   (and (pair? t1) (eq? 'list (car t1))))))
+                   (and (pair? t1) (eq? 'list-of (car t1))))))
          ((and (pair? t1) (pair? t2) (eq? (car t1) (car t2)))
           (case (car t1)
             ((procedure)
@@ -1074,37 +1082,105 @@
                     (match-results results1 results2))))
             ((struct) (equal? t1 t2))
             ((pair) (every match1 (cdr t1) (cdr t2)))
-            ((list vector) (match1 (second t1) (second t2)))
+            ((list-of vector-of) (match1 (second t1) (second t2)))
+            ((list vector)
+             (and (= (length t1) (length t2))
+                  (every match1 (cdr t1) (cdr t2))))
             (else #f) ) )
          ((and (pair? t1) (eq? 'pair (car t1)))
           (and (not exact) (not all)
                (pair? t2)
-               (eq? 'list (car t2))
-               (match1 (second t1) (second t2))
-               (match1 (third t1) t2)))
+               (case (car t2)
+                 ((list-of)
+                  (and (match1 (second t1) (second t2))
+                       (match1 (third t1) t2)))
+                 ((list)
+                  (and (match1 (second t1) (second t2))
+                       (match1 (third t1)
+                               (if (null? (cdr t2))
+                                   'null
+                                   `(list ,@(cddr t2))))))
+                 (else #f))))
          ((and (pair? t2) (eq? 'pair (car t2)))
-          (and (not exact)
-               (pair? t1)
-               (eq? 'list (car t1))
-               (match1 (second t1) (second t2))
-               (match1 t1 (third t2))))
-         ((and (pair? t1) (eq? 'list (car t1)))
-          ;;XXX (list T) == (pair T (pair T ... (pair T null)))
+          (and (pair? t1)
+               (case (car t1)
+                 ((list-of)
+                  (and (not exact)
+                       (match1 (second t1) (second t2))
+                       (match1 t1 (third t2))))
+                 ((list)
+                  (and (match1 (second t1) (second t2))
+                       (or (not exact) (pair? (cdr t1)))
+                       (match1 (if (null? (cdr t1))
+                                   'null
+                                   `(list ,@(cddr t1)))
+                               (third t2))))
+                 (else #f))))
+         ((and (pair? t1) (eq? 'list-of (car t1)))
+          ;;XXX (list-of T) == (pair T (pair T ... (pair T null)))
           ;;     should also work in exact mode
           (and (not exact) (not all)
                (or (eq? 'null t2)
                    (and (pair? t2)
-                        (eq? 'pair (car t2))
-                        (match1 (second t1) (second t2))
-                        (match1 t1 (third t2))))))
-         ((and (pair? t2) (eq? 'list (car t2)))
+                        (case (car t2)
+                          ((pair)
+                           (and (match1 (second t1) (second t2))
+                                (match1 t1 (third t2))))
+                          ((list)
+                           (match1 
+                            (second t1) 
+                            (simplify-type `(or ,@(cdr t2)))))
+                          (else #f))))))
+         ((and (pair? t1) (eq? 'list (car t1)))
+          (and (pair? t2)
+               (case (car t2)
+                 ((pair)
+                  (and (pair? (cdr t1))
+                       (match1 (second t1) (second t2))
+                       (match1 t1 (third t2))))
+                 ((list-of)
+                  (and (not exact) (not all)                   
+                       (match1 
+                        (simplify-type `(or ,@(cdr t1)))
+                        (second t2))))
+                 (else #f))))
+         ((and (pair? t2) (eq? 'list-of (car t2)))
           (and (not exact)
                (or (eq? 'null t1)
                    (and (pair? t1)
-                        (eq? 'pair (car t1))
-                        (match1 (second t1) (second t2))
-                        (match1 (third t1) t2)))))
+                        (case (car t1)
+                          ((pair)
+                           (and (match1 (second t1) (second t2))
+                                (match1 (third t1) t2)))
+                          ((list)
+                           (match1 
+                            (simplify-type `(or ,@(cdr t1)))
+                            (second t2)))
+                          (else #f))))))
+         ((and (pair? t2) (eq? 'list (car t2)))
+          (and (pair? t1)
+               (case (car t1)
+                 ((pair)
+                  (and (pair? (cdr t2))
+                       (match1 (second t1) (second t2))
+                       (match1 (third t1) t2)))
+                 ((list-of)
+                  (and (not exact) (not all)
+                       (match1
+                        (second t1)
+                        (simplify-type `(or ,@(cdr t2))))))
+                 (else #f))))
+         ((and (pair? t1) (eq? 'vector (car t1)))
+          (and (not exact) (not all)
+               (pair? t2)
+               (eq? 'vector-of (car t2))
+               (match1 (simplify-type `(or ,@(cdr t1))) (second t2))))
+         ((and (pair? t2) (eq? 'vector (car t2)))
+          (and (pair? t1)
+               (eq? 'vector-of (car t1))
+               (match1 (second t1) (simplify-type `(or ,@(cdr t2))))))
          (else #f)))
+
   (let ((m (match1 t1 t2)))
     (dd "    match~a~a ~a <-> ~a -> ~a  te: ~s" 
        (if exact " (exact)" "") 
@@ -1176,6 +1252,7 @@
                  ((or)
                   (let ((ts (map simplify (cdr t))))
                     (cond ((= 1 (length ts)) (car ts))
+                          ((null? ts) '*)
                           ((every procedure-type? ts)
                            (if (any (cut eq? 'procedure <>) ts)
                                'procedure
@@ -1227,11 +1304,22 @@
                           (cond ((and (pair? tr) (eq? 'pair (first tr)))
                                  (rec (third tr) (cons (second tr) ts)))
                                 (else `(pair ,tcar ,tcdr)))))))
-                 ((vector list)
+                 ((vector-of)
+                  (let ((t2 (simplify (second t))))
+                    (if (eq? t2 '*)
+                        'vector
+                        `(,(car t) ,t2))))
+                 ((vector-of list-of)
                   (let ((t2 (simplify (second t))))
                     (if (eq? t2 '*)
-                        (car t)
+                        'list
                         `(,(car t) ,t2))))
+                 ((list)
+                  (if (null? (cdr t))
+                      'null
+                      `(list ,@(map simplify (cdr t)))))
+                 ((vector)
+                  `(vector ,@(map simplify (cdr t))))
                  ((procedure)
                   (let* ((name (and (named? t) (cadr t)))
                          (rtypes (if name (cdddr t) (cddr t))))
@@ -1352,7 +1440,7 @@
          ((memq t1 '(vector list)) (type<=? `(,t1 *) t2))
          ((and (eq? 'null t1)
                (pair? t2) 
-               (eq? (car t2) 'list)))
+               (eq? (car t2) 'list-of)))
          ((and (pair? t1) (eq? 'forall (car t1)))
           (extract-vars (second t1))
           (type<=? (third t1) t2))
@@ -1363,18 +1451,27 @@
           (case t2
             ((procedure) (and (pair? t1) (eq? 'procedure (car t1))))
             ((number) (memq t1 '(fixnum float)))
-            ((vector list) (type<=? t1 `(,t2 *)))
+            ((vector) (type<=? t1 '(vector-of *)))
+            ((list) (type<=? t1 '(list-of *)))
             ((pair) (type<=? t1 '(pair * *)))
             (else
              (cond ((not (pair? t1)) #f)
                    ((not (pair? t2)) #f)
                    ((eq? 'or (car t2))
                     (every (cut type<=? t1 <>) (cdr t2)))
+                   ((and (eq? 'vector (car t1)) (eq? 'vector-of (car t2)))
+                    (every (cute type<=? <> (second t2)) (cdr t1)))
+                   ((and (eq? 'vector-of (car t1)) (eq? 'vector (car t2)))
+                    (every (cute type<=? (second t1) <>) (cdr t2)))
+                   ((and (eq? 'list (car t1)) (eq? 'list-of (car t2)))
+                    (every (cute type<=? <> (second t2)) (cdr t1)))
+                   ((and (eq? 'list-of (car t1)) (eq? 'list (car t2)))
+                    (every (cute type<=? (second t1) <>) (cdr t2)))
                    ((not (eq? (car t1) (car t2))) #f)
                    (else
                     (case (car t1)
                       ((or) (every (cut type<=? <> t2) (cdr t1)))
-                      ((vector list) (type<=? (second t1) (second t2)))
+                      ((vector-of list-of) (type<=? (second t1) (second t2)))
                       ((pair) (every type<=? (cdr t1) (cdr t2)))
                       ((procedure)
                        (let ((args1 (if (named? t1) (caddr t1) (cadr t1)))
@@ -1627,7 +1724,7 @@
             ((or) `(or ,@(map (cut resolve <> done) (cdr t))))
             ((not) `(not ,(resolve (second t) done)))
             ((forall) `(forall ,(second t) ,(resolve (third t) done)))
-            ((pair list vector) 
+            ((pair list vector vector-of list-of) 
              (cons (car t) (map (cut resolve <> done) (cdr t))))
             ((procedure)
              (let* ((argtypes (procedure-arguments t))
@@ -1894,10 +1991,18 @@
                          (set! ptype (cons t (validate (cadr cp))))
                          (and ok t))
                         (else #f))))))
-           ((memq (car t) '(vector list))
-            (and (= 2 (length t))
+           ((memq (car t) '(vector-of list-of))
+            (and (list? t)
+                 (= 2 (length t))
                  (let ((t2 (validate (second t))))
                    (and t2 `(,(car t) ,t2)))))
+           ((memq (car t) '(vector list))
+            (and (list? t)
+                 (let loop ((ts (cdr t)) (ts2 '()))
+                   (cond ((null? ts) `(,(car t) ,@(reverse ts2)))
+                         ((validate (car ts)) => 
+                          (lambda (t2) (loop (cdr ts) (cons t2 ts2))))
+                         (else #f)))))
            ((eq? 'pair (car t))
             (and (= 3 (length t))
                  (let ((ts (map validate (cdr t))))
@@ -1997,7 +2102,7 @@
      (##sys#put! 'name '##compiler#special-result-type handler))))
 
 (define-special-case ##sys#make-structure
-  (lambda (node rtypes)
+  (lambda (node args rtypes)
     (or (let ((subs (node-subexpressions node)))
          (and (>= (length subs) 2)
               (let ((arg1 (second subs)))
@@ -2011,6 +2116,43 @@
                                 `((struct ,val)))))))))
        rtypes)))
 
+(let ()
+  (define (vector-ref-result-type node args rtypes)
+    (or (let ((subs (node-subexpressions node))
+             (arg1 (second args)))
+         (and (pair? arg1)
+              (eq? 'vector (car arg1))
+              (= (length subs) 3)
+              (let ((index (third subs)))
+                (and (eq? 'quote (node-class index))
+                     (let ((val (first (node-parameters index))))
+                       (and (fixnum? val)
+                            (>= val 0) (< val (length (cdr arg1))) ;XXX could 
warn on failure
+                            (list (list-ref (cdr arg1) val))))))))
+       rtypes))
+  (define-special-case vector-ref vector-ref-result-type)
+  (define-special-case ##sys#vector-ref vector-ref-result-type))
+
+(define-special-case list
+  (lambda (node args rtypes)
+    (if (null? (cdr args))
+       '(null)
+       `((list ,@(cdr args))))))
+
+(define-special-case ##sys#list
+  (lambda (node args rtypes)
+    (if (null? (cdr args))
+       '(null)
+       `((list ,@(cdr args))))))
+
+(define-special-case vector
+  (lambda (node args rtypes)
+    `((vector ,@(cdr args)))))
+
+(define-special-case ##sys#vector
+  (lambda (node args rtypes)
+    `((vector ,@(cdr args)))))
+
 
 ;;; generate type-checks for formal variables
 ;
@@ -2080,7 +2222,7 @@
                   ,(test (third t) `(##sys#slot ,v 1))
                   '#f)
               '#f))
-        ((list)
+        ((list-of)
          (let ((var (gensym)))
            `(if (##core#inline "C_i_listp" ,v)
                 (##sys#check-list-items ;XXX missing
@@ -2088,7 +2230,7 @@
                  (lambda (,var) 
                    ,(test (second t) var)))
                 '#f)))
-        ((vector)
+        ((vector-of)
          (let ((var (gensym)))
            `(if (##core#inline "C_i_vectorp" ,v)
                 (##sys#check-vector-items ;XXX missing
@@ -2096,6 +2238,7 @@
                  (lambda (,var) 
                    ,(test (second t) var)))
                 '#f)))
+        ;;XXX missing: vector, list
         ((not)
          `(not ,(test (cadr t) v)))
         (else (bomb "generate-type-checks!: invalid type" t v))))))
diff --git a/tests/runtests.sh b/tests/runtests.sh
index 4a24457..332b980 100644
--- a/tests/runtests.sh
+++ b/tests/runtests.sh
@@ -86,7 +86,7 @@ diff -bu scrutiny.expected scrutiny.out
 $compile scrutiny-tests-2.scm -scrutinize -analyze-only -ignore-repository 
-types $TYPESDB 2>scrutiny-2.out -verbose
 
 if test -n "$MSYSTEM"; then
-    dos2unix scrutiny.out
+    dos2unix scrutiny-2.out
 fi
 
 # this is sensitive to gensym-names, so make it optional
diff --git a/tests/scrutiny-2.expected b/tests/scrutiny-2.expected
index 4e2fa56..55f6602 100644
--- a/tests/scrutiny-2.expected
+++ b/tests/scrutiny-2.expected
@@ -9,6 +9,10 @@ Note: at toplevel:
 
 Note: at toplevel:
   in procedure call to `pair?', the predicate is called with an argument of 
type
+  `null' and will always return false
+
+Note: at toplevel:
+  in procedure call to `pair?', the predicate is called with an argument of 
type
   `fixnum' and will always return false
 
 Note: at toplevel:
@@ -17,7 +21,7 @@ Note: at toplevel:
 
 Note: at toplevel:
   in procedure call to `list?', the predicate is called with an argument of 
type
-  `list' and will always return true
+  `null' and will always return true
 
 Note: at toplevel:
   in procedure call to `list?', the predicate is called with an argument of 
type
@@ -41,6 +45,10 @@ Note: at toplevel:
 
 Note: at toplevel:
   in procedure call to `null?', the predicate is called with an argument of 
type
+  `null' and will always return true
+
+Note: at toplevel:
+  in procedure call to `null?', the predicate is called with an argument of 
type
   `fixnum' and will always return false
 
 Note: at toplevel:
diff --git a/tests/typematch-tests.scm b/tests/typematch-tests.scm
index 6162270..eb437e0 100644
--- a/tests/typematch-tests.scm
+++ b/tests/typematch-tests.scm
@@ -105,10 +105,9 @@
 (check #\x 1.2 char)
 (check #t 1.2 boolean)
 (check (+ 1 2) 'a number)
-(check '(1) 1.2 (pair fixnum null))
-(check '(a) 1.2 (pair symbol null))
-(check (list 1) '(1 . 2) list)
-(check '(1) 1.2 pair)
+(check '(1) 1.2 (list fixnum))
+(check '(a) 1.2 (list symbol))
+(check (list 1) '(1 . 2) (list fixnum))
 (check '(1 . 2) '() pair)
 (check + 1.2 procedure)
 (check '#(1) 1.2 vector)
@@ -121,17 +120,17 @@
 (check (##sys#make-structure 'promise) 1 (struct promise))
 (check '(1 . 2.3) '(a) (pair fixnum float))
 (check '#(a) 1 (vector symbol))
-(check '("ok") 1 (pair string null))
+(check '("ok") 1 (list string))
 
 (ms 123 1.2 fixnum)
 (ms "abc" 1.2 string)
 (ms 'abc 1.2 symbol)
 (ms #\x 1.2 char)
 (ms #t 1.2 boolean)
-(ms '(1) 1.2 pair)
+(ms '(1) 1.2 (list fixnum))
 (ms '(1 . 2) '() pair)
 (ms + 1.2 procedure)
-(ms '#(1) 1.2 vector)
+(ms '#(1) 1.2 (vector fixnum))
 (ms '() 1 null)
 (ms (void) 1.2 undefined)
 (ms (current-input-port) 1.2 port)
@@ -142,8 +141,8 @@
 (ms (##sys#make-structure 'promise) 1 (struct promise))
 (ms '(1 . 2.3) '(a) (pair fixnum float))
 (ms '#(a) 1 (vector symbol))
-(ms '(1) "a" (or pair symbol))
-(ms (list 1) 'a list)
+(ms '(1) "a" (or (list fixnum) symbol))
+(ms (list 1) 'a (list fixnum))
 (ms '() 'a (or null pair))
 
 (define n 1)
@@ -152,7 +151,7 @@
 (checkp boolean? #f boolean)
 (checkp pair? '(1 . 2) pair)
 (checkp null? '() null)
-(checkp list? '(1) list)
+(checkp list? '(1) (list fixnum))
 (checkp symbol? 'a symbol)
 (checkp number? (+ n) number)
 (checkp number? (+ n) number)
@@ -177,4 +176,26 @@
 (mn (procedure () *) (procedure () * *))
 
 (mx (forall (a) (procedure (#!rest a) a)) +)
-(mx (or pair null) '(1))
+(mx (list fixnum) '(1))
+
+
+;;; special cases
+
+(let ((x (##sys#make-structure 'foo)))
+  (mx (struct foo) x))
+
+(define x 1)
+
+(assert 
+ (eq? 'number
+      (compiler-typecase (vector-ref '#(1 2 3.4) x)
+       (fixnum 'fixnum)
+       (float 'float)
+       (number 'number))))
+
+(mx float (vector-ref '#(1 2 3.4) 2))
+(mx fixnum (vector-ref '#(1 2 3.4) 0))
+(mx float (##sys#vector-ref '#(1 2 3.4) 2))
+(mx fixnum (##sys#vector-ref '#(1 2 3.4) 0))
+(mx (vector fixnum float) (vector 1 2.3))
+(mx (list fixnum float) (list 1 2.3))
diff --git a/types.db b/types.db
index 859a289..172326b 100644
--- a/types.db
+++ b/types.db
@@ -147,11 +147,9 @@
 (null? (#(procedure #:pure #:predicate null) null? (*) boolean))
 (list? (#(procedure #:pure #:predicate list) list? (*) boolean))
 
-(list (#(procedure #:pure) list (#!rest) list)
-      (() (null) '()))
-
-(##sys#list (#(procedure #:pure) ##sys#list (#!rest) list)
-           (() (null) '()))
+;; special cased (see scrutinizer.scm)
+(list (#(procedure #:pure) list (#!rest) list))
+(##sys#list (#(procedure #:pure) ##sys#list (#!rest) list))
 
 (length (#(procedure #:clean #:enforce) length (list) fixnum) ; may loop
        ((null) '0)
@@ -161,8 +159,9 @@
              ((null) '0)
              ((list) (##core#inline "C_u_i_length" #(1))))
 
-(list-tail (forall (a) (#(procedure #:clean #:enforce) list-tail ((list a) 
fixnum) (list a))))
-(list-ref (forall (a) (#(procedure #:clean #:enforce) list-ref ((list a) 
fixnum) a)))
+(list-tail (forall (a) (#(procedure #:clean #:enforce) list-tail ((list-of a) 
fixnum) (list-of a))))
+(list-ref (forall (a) (#(procedure #:clean #:enforce) list-ref ((list-of a) 
fixnum) a)))
+
 (append (#(procedure #:clean) append (list #!rest) *))
 (##sys#append (#(procedure #:clean) ##sys#append (list #!rest) *))
 (reverse (forall (a) (#(procedure #:clean #:enforce) reverse ((list a)) (list 
a))))
@@ -510,20 +509,24 @@
 
 ;(string-copy (#(procedure #:clean #:enforce) string-copy (string) string)) - 
we use the more general version from srfi-13
 
-(string->list (#(procedure #:clean #:enforce) string->list (string) (list 
char)))
-(list->string (#(procedure #:clean #:enforce) list->string ((list char)) 
string))
+(string->list (#(procedure #:clean #:enforce) string->list (string) (list-of 
char)))
+(list->string (#(procedure #:clean #:enforce) list->string ((list-of char)) 
string))
 (substring (#(procedure #:clean #:enforce) substring (string fixnum #!optional 
fixnum) string))
 ;(string-fill! (#(procedure #:clean #:enforce) string-fill! (string char) 
string)) - s.a.
 (string (#(procedure #:clean #:enforce) string (#!rest char) string))
 
 (vector? (#(procedure #:pure #:predicate vector) vector? (*) boolean))
 
-;; not result type "(vector a)", since it may be mutated!
-(make-vector (forall (a) (#(procedure #:clean #:enforce) make-vector (fixnum 
#!optional a) vector)))
+(make-vector (forall (a) (#(procedure #:clean #:enforce) make-vector (fixnum 
#!optional a) 
+                         (vector-of a))))
+
+;; these are special cased (see scrutinizer.scm)
+(vector-ref (forall (a) (#(procedure #:clean #:enforce) vector-ref ((vector-of 
a) fixnum) a)))
+(##sys#vector-ref (forall (a) (#(procedure #:clean #:enforce) ##sys#vector-ref 
((vector-of a) fixnum) a)))
 
-(vector-ref (forall (a) (#(procedure #:clean #:enforce) vector-ref ((vector a) 
fixnum) a)))
-(##sys#vector-ref (forall (a) (#(procedure #:clean #:enforce) ##sys#vector-ref 
((vector a) fixnum) a)))
 (vector-set! (#(procedure #:enforce) vector-set! (vector fixnum *) undefined))
+
+;; special cased (see scrutinizer.scm)
 (vector (#(procedure #:clean #:clean) vector (#!rest) vector))
 (##sys#vector (#(procedure #:clean #:clean) ##sys#vector (#!rest) vector))
 
@@ -532,20 +535,20 @@
 (##sys#vector-length (#(procedure #:clean #:enforce) ##sys#vector-length 
(vector) fixnum)
                     ((vector) (##sys#size #(1))))
 
-(vector->list (forall (a) (#(procedure #:clean #:enforce) vector->list 
((vector a)) (list a))))
-(##sys#vector->list (forall (a) (#(procedure #:clean #:enforce) 
##sys#vector->list ((vector a)) (list a))))
-(list->vector (forall (a) (#(procedure #:clean #:enforce) list->vector ((list 
a)) (vector a))))
-(##sys#list->vector (forall (a) (#(procedure #:clean #:enforce) 
##sys#list->vector ((list a)) (vector a))))
+(vector->list (forall (a) (#(procedure #:clean #:enforce) vector->list 
((vector-of a)) (list-of a))))
+(##sys#vector->list (forall (a) (#(procedure #:clean #:enforce) 
##sys#vector->list ((vector-of a)) (list-of a))))
+(list->vector (forall (a) (#(procedure #:clean #:enforce) list->vector 
((list-of a)) (vector-of a))))
+(##sys#list->vector (forall (a) (#(procedure #:clean #:enforce) 
##sys#list->vector ((list-of a)) (vector-of a))))
 (vector-fill! (#(procedure #:enforce) vector-fill! (vector *) undefined))
 
 (procedure? (#(procedure #:pure #:predicate procedure) procedure? (*) boolean))
 
 (vector-copy! (#(procedure #:enforce) vector-copy! (vector vector #!optional 
fixnum) undefined))
 
-(map (forall (a b) (#(procedure #:enforce) map ((procedure (a #!rest) b) (list 
a) #!rest list) (list b))))
+(map (forall (a b) (#(procedure #:enforce) map ((procedure (a #!rest) b) 
(list-of a) #!rest list) (list-of b))))
 
 (for-each
- (forall (a) (#(procedure #:enforce) for-each ((procedure (a #!rest) . *) 
(list a) #!rest list) undefined)))
+ (forall (a) (#(procedure #:enforce) for-each ((procedure (a #!rest) . *) 
(list-of a) #!rest list) undefined)))
 
 (apply (#(procedure #:enforce) apply (procedure #!rest) . *))
 (##sys#apply (#(procedure #:enforce) ##sys#apply (procedure #!rest) . *))
@@ -662,8 +665,8 @@
       ((float) (float) 
        (##core#inline_allocate ("C_a_i_flonum_plus" 4) #(1) '1.0)))
 
-(argc+argv (#(procedure #:clean) argc+argv () fixnum (list string) fixnum))
-(argv (#(procedure #:clean) argv () (list string)))
+(argc+argv (#(procedure #:clean) argc+argv () fixnum (list-of string) fixnum))
+(argv (#(procedure #:clean) argv () (list-of string)))
 (arithmetic-shift (#(procedure #:clean #:enforce) arithmetic-shift (number 
number) number))
 
 (bit-set? (#(procedure #:clean #:enforce) bit-set? (number fixnum) boolean)
@@ -697,13 +700,13 @@
 (char-name (#(procedure #:clean #:enforce) char-name ((or char symbol) 
#!optional char) *)) ;XXX -> (or char symbol) ?
 (chicken-home (#(procedure #:clean) chicken-home () string))
 (chicken-version (#(procedure #:pure) chicken-version (#!optional *) string))
-(command-line-arguments (#(procedure #:clean) command-line-arguments 
(#!optional (list string)) (list string)))
+(command-line-arguments (#(procedure #:clean) command-line-arguments 
(#!optional (list-of string)) (list-of string)))
 (condition-predicate (#(procedure #:clean #:enforce) condition-predicate 
(symbol) (procedure ((struct condition)) boolean)))
 (condition-property-accessor (#(procedure #:clean #:enforce) 
condition-property-accessor (symbol symbol #!optional *) (procedure ((struct 
condition)) *)))
 
 (condition? (#(procedure #:pure #:predicate (struct condition)) condition? (*) 
boolean))
 
-(condition->list (#(procedure #:clean #:enforce) condition->list ((struct 
condition)) (list (pair symbol *))))
+(condition->list (#(procedure #:clean #:enforce) condition->list ((struct 
condition)) (list-of (pair symbol *))))
 (continuation-capture (#(procedure #:enforce) continuation-capture ((procedure 
((struct continuation)) . *)) *))
 (continuation-graft (#(procedure #:clean #:enforce) continuation-graft 
((struct continuation) (procedure () . *)) *))
 (continuation-return (#(procedure #:enforce) continuation-return (procedure 
#!rest) . *)) ;XXX make return type more specific?
@@ -758,7 +761,7 @@
 (expand (procedure expand (* #!optional list) *))
 (extension-information (#(procedure #:clean) extension-information (symbol) *))
 (feature? (#(procedure #:clean) feature? (symbol) boolean))
-(features (#(procedure #:clean) features () (list symbol)))
+(features (#(procedure #:clean) features () (list-of symbol)))
 (file-exists? (#(procedure #:clean #:enforce) file-exists? (string) (or 
boolean string)))
 (directory-exists? (#(procedure #:clean #:enforce) directory-exists? (string) 
(or boolean string)))
 
@@ -785,8 +788,8 @@
 
 (flush-output (#(procedure #:enforce) flush-output (#!optional port) 
undefined))
 
-(foldl (forall (a b) (#(procedure #:enforce) foldl ((procedure (a b) a) a 
(list b)) a)))
-(foldr (forall (a b) (#(procedure #:enforce) foldr ((procedure (a b) b) b 
(list a)) b)))
+(foldl (forall (a b) (#(procedure #:enforce) foldl ((procedure (a b) a) a 
(list-of b)) a)))
+(foldr (forall (a b) (#(procedure #:enforce) foldr ((procedure (a b) b) b 
(list-of a)) b)))
 
 (force-finalizers (procedure force-finalizers () undefined))
 
@@ -906,7 +909,7 @@
 (get (#(procedure #:clean #:enforce) get (symbol symbol #!optional *) *)
      ((symbol symbol *) (##core#inline "C_i_getprop" #(1) #(2) #(3))))
 
-(get-call-chain (#(procedure #:clean #:enforce) get-call-chain (#!optional 
fixnum (struct thread)) (list vector)))
+(get-call-chain (#(procedure #:clean #:enforce) get-call-chain (#!optional 
fixnum (struct thread)) (list-of vector)))
 (get-condition-property (#(procedure #:clean #:enforce) get-condition-property 
((struct condition) symbol symbol #!optional *) *))
 (get-environment-variable (#(procedure #:clean #:enforce) 
get-environment-variable (string) *))
 (get-keyword (#(procedure #:clean #:enforce) get-keyword (symbol list 
#!optional *) *))
@@ -944,7 +947,7 @@
 (make-parameter (#(procedure #:clean #:enforce) make-parameter (* #!optional 
procedure) procedure))
 (make-property-condition (#(procedure #:clean #:enforce) 
make-property-condition (symbol #!rest *) (struct condition)))
 (maximum-flonum float)
-(memory-statistics (#(procedure #:clean) memory-statistics () (vector fixnum)))
+(memory-statistics (#(procedure #:clean) memory-statistics () (vector-of 
fixnum)))
 (minimum-flonum float)
 (module-environment (#(procedure #:clean #:enforce) module-environment (symbol 
#!optional symbol) (struct environment)))
 (most-negative-fixnum fixnum)
@@ -984,7 +987,7 @@
 (reset (procedure reset () noreturn))
 (reset-handler (#(procedure #:clean #:enforce) reset-handler (#!optional 
(procedure () . *)) procedure))
 (return-to-host (procedure return-to-host () . *))
-(reverse-list->string (#(procedure #:clean #:enforce) reverse-list->string 
((list char)) string))
+(reverse-list->string (#(procedure #:clean #:enforce) reverse-list->string 
((list-of char)) string))
 (set-finalizer! (#(procedure #:clean #:enforce) set-finalizer! (* (procedure 
(*) . *)) *))
 (set-gc-report! (#(procedure #:clean) set-gc-report! (*) undefined))
 
@@ -1010,7 +1013,7 @@
       ((float) (float)
        (##core#inline_allocate ("C_a_i_flonum_difference" 4) #(1) '1.0)))
 
-(subvector (forall (a) (#(procedure #:clean #:enforce) subvector ((vector a) 
fixnum #!optional fixnum) (vector a))))
+(subvector (forall (a) (#(procedure #:clean #:enforce) subvector ((vector-of 
a) fixnum #!optional fixnum) (vector-of a))))
 (symbol-escape (#(procedure #:clean) symbol-escape (#!optional *) *))
 
 (symbol-plist (#(procedure #:clean #:enforce) symbol-plist (symbol) list)
@@ -1020,8 +1023,8 @@
 (system (#(procedure #:clean #:enforce) system (string) fixnum))
 (unregister-feature! (#(procedure #:clean #:enforce) unregister-feature! 
(#!rest symbol) undefined))
 (vector-resize
- (forall (a) (#(procedure #:clean #:enforce) vector-resize ((vector a) fixnum 
#!optional *) 
-             (vector a))))
+ (forall (a) (#(procedure #:clean #:enforce) vector-resize ((vector-of a) 
fixnum #!optional *) 
+             (vector-of a))))
 (void (#(procedure #:pure) void (#!rest) undefined))
 (##sys#void (#(procedure #:pure) void (#!rest) undefined))
 (warning (procedure warning (* #!rest) undefined))
@@ -1093,8 +1096,8 @@
 (->string (procedure ->string (*) string)
          ((string) #(1)))
 
-(alist-ref (#(procedure #:clean #:enforce) alist-ref (* (list pair) #!optional 
(procedure (* *) *) *) *))
-(alist-update! (#(procedure #:enforce) alist-update! (* * (list pair) 
#!optional (procedure (* *) *)) *))
+(alist-ref (#(procedure #:clean #:enforce) alist-ref (* (list-of pair) 
#!optional (procedure (* *) *) *) *))
+(alist-update! (#(procedure #:enforce) alist-update! (* * (list-of pair) 
#!optional (procedure (* *) *)) *))
 (always? deprecated)
 
 (any? (#(procedure #:pure) any? (*) boolean)
@@ -1104,12 +1107,12 @@
        ((pair) (let ((#(tmp) #(1))) '#f))
        (((not (or pair list))) (let ((#(tmp) #(1))) '#t)))
 
-(binary-search (forall (a) (#(procedure #:enforce) binary-search ((vector a) 
(procedure (a) *)) *)))
-(butlast (forall (a) (#(procedure #:clean #:enforce) butlast ((pair a *)) 
(list a))))
-(chop (forall (a) (#(procedure #:clean #:enforce) chop ((list a) fixnum) (list 
a))))
+(binary-search (forall (a) (#(procedure #:enforce) binary-search ((vector-of 
a) (procedure (a) *)) *)))
+(butlast (forall (a) (#(procedure #:clean #:enforce) butlast ((pair a *)) 
(list-of a))))
+(chop (forall (a) (#(procedure #:clean #:enforce) chop ((list-of a) fixnum) 
(list-of a))))
 (complement (#(procedure #:clean #:enforce) complement ((procedure (#!rest) 
*)) (procedure (#!rest) boolean)))
 (compose (#(procedure #:clean #:enforce) compose (#!rest procedure) procedure))
-(compress (forall (a) (#(procedure #:clean #:enforce) compress (list (list a)) 
(list a))))
+(compress (forall (a) (#(procedure #:clean #:enforce) compress (list (list-of 
a)) (list-of a))))
 (conc (procedure conc (#!rest) string))
 (conjoin (#(procedure #:clean #:enforce) conjoin (#!rest (procedure (*) *)) 
(procedure (*) *)))
 (constantly (forall (a) (#(procedure #:pure) constantly (a) (procedure 
(#!rest) a))))
@@ -1126,11 +1129,11 @@
 
 (merge 
  (forall (e)
-        (#(procedure #:enforce) merge ((list e) (list e) (procedure (e e) *)) 
(list e))))
+        (#(procedure #:enforce) merge ((list-of e) (list-of e) (procedure (e 
e) *)) (list-of e))))
 
 (merge!
  (forall (e)
-        (#(procedure #:enforce) merge! ((list e) (list e) (procedure (e e) *)) 
(list e))))
+        (#(procedure #:enforce) merge! ((list-of e) (list-of e) (procedure (e 
e) *)) (list-of e))))
 
 (never? deprecated)
 (none? deprecated)
@@ -1152,36 +1155,36 @@
 (queue-remove! (#(procedure #:clean #:enforce) queue-remove! ((struct queue)) 
*))
 (queue? (#(procedure #:pure #:predicate (struct queue)) queue? (*) boolean))
 
-(rassoc (#(procedure #:clean #:enforce) rassoc (* (list pair) #!optional 
(procedure (* *) *)) *))
-(reverse-string-append (#(procedure #:clean #:enforce) reverse-string-append 
((list string)) string))
+(rassoc (#(procedure #:clean #:enforce) rassoc (* (list-of pair) #!optional 
(procedure (* *) *)) *))
+(reverse-string-append (#(procedure #:clean #:enforce) reverse-string-append 
((list-of string)) string))
 (shuffle deprecated)
 
-;;   (: sort (forall (e (s (or (vector e) (list e)))) (s (e e -> *) -> s)))
-;; if we had contraints for "forall"
+;;   (: sort (forall (e (s (or (vector-of e) (list-of e)))) (s (e e -> *) -> 
s)))
+;; if we had constraints for "forall"
 (sort
- (forall (e (s (or (vector e) (list e))))
+ (forall (e (s (or (vector-of e) (list-of e))))
         (#(procedure #:enforce) 
          sort
          (s (procedure (e e) *)) 
          s)))
 
 (sort!
- (forall (e (s (or (vector e) (list e))))
+ (forall (e (s (or (vector-of e) (list-of e))))
         (#(procedure #:enforce) 
          sort
          (s (procedure (e e) *)) 
          s)))
 
 (sorted? (#(procedure #:enforce) sorted? ((or list vector) (procedure (* *) 
*)) boolean))
-(topological-sort (#(procedure #:enforce) topological-sort ((list list) 
(procedure (* *) *)) list))
+(topological-sort (#(procedure #:enforce) topological-sort ((list-of list) 
(procedure (* *) *)) list))
 (string-chomp (#(procedure #:clean #:enforce) string-chomp (string #!optional 
string) string))
-(string-chop (#(procedure #:clean #:enforce) string-chop (string fixnum) (list 
string)))
+(string-chop (#(procedure #:clean #:enforce) string-chop (string fixnum) 
(list-of string)))
 (string-compare3 (#(procedure #:clean #:enforce) string-compare3 (string 
string) fixnum))
 (string-compare3-ci (#(procedure #:clean #:enforce) string-compare3-ci (string 
string) fixnum))
-(string-intersperse (#(procedure #:clean #:enforce) string-intersperse ((list 
string) #!optional string) string))
-(string-split (#(procedure #:clean #:enforce) string-split (string #!optional 
string *) (list string)))
+(string-intersperse (#(procedure #:clean #:enforce) string-intersperse 
((list-of string) #!optional string) string))
+(string-split (#(procedure #:clean #:enforce) string-split (string #!optional 
string *) (list-of string)))
 (string-translate (#(procedure #:clean #:enforce) string-translate (string * 
#!optional *) string))
-(string-translate* (#(procedure #:clean #:enforce) string-translate* (string 
(list (pair string string))) string))
+(string-translate* (#(procedure #:clean #:enforce) string-translate* (string 
(list-of (pair string string))) string))
 (substring-ci=? (#(procedure #:clean #:enforce) substring-ci=? (string string 
#!optional fixnum fixnum fixnum) boolean))
 
 (substring-index (#(procedure #:clean #:enforce) substring-index (string 
string #!optional fixnum) (or boolean fixnum))
@@ -1210,7 +1213,7 @@
 (read-byte (#(procedure #:enforce) read-byte (#!optional port) *))
 (read-file (#(procedure #:enforce) read-file (#!optional (or port string) 
(procedure (port) *) fixnum) list))
 (read-line (#(procedure #:enforce) read-line (#!optional port (or boolean 
fixnum)) *))
-(read-lines (#(procedure #:enforce) read-lines (#!optional (or port string) 
fixnum) (list string)))
+(read-lines (#(procedure #:enforce) read-lines (#!optional (or port string) 
fixnum) (list-of string)))
 (read-string (#(procedure #:enforce) read-string (#!optional * port) string))
 (read-string! (#(procedure #:enforce) read-string! (fixnum string #!optional 
port fixnum) fixnum))
 (read-token (#(procedure #:enforce) read-token ((procedure (char) *) 
#!optional port) string))
@@ -1477,7 +1480,7 @@
 (port-for-each (#(procedure #:enforce) port-for-each ((procedure (*) *) 
(procedure () . *)) undefined))
 
 (port-map
- (forall (a b) (#(procedure #:enforce) port-map ((procedure (a) b) (procedure 
() a)) (list b))))
+ (forall (a b) (#(procedure #:enforce) port-map ((procedure (a) b) (procedure 
() a)) (list-of b))))
 
 (port-fold (#(procedure #:enforce) port-fold ((procedure (* *) *) * (procedure 
() *)) *))
 (make-broadcast-port (#(procedure #:clean #:enforce) make-broadcast-port 
(#!rest port) port))
@@ -1513,13 +1516,13 @@
 (current-effective-user-id (#(procedure #:clean) current-effective-user-id () 
fixnum))
 (current-effective-user-name (#(procedure #:clean) current-effective-user-name 
() string))
 (current-environment deprecated)
-(get-environment-variables (#(procedure #:clean) get-environment-variables () 
(list string)))
+(get-environment-variables (#(procedure #:clean) get-environment-variables () 
(list-of string)))
 (current-group-id (#(procedure #:clean) current-group-id () fixnum))
 (current-process-id (#(procedure #:clean) current-process-id () fixnum))
 (current-user-id (#(procedure #:clean) current-user-id () fixnum))
 (current-user-name (#(procedure #:clean) current-user-name () string))
 (delete-directory (#(procedure #:clean #:enforce) delete-directory (string) 
string))
-(directory (#(procedure #:clean #:enforce) directory (string #!optional *) 
(list string)))
+(directory (#(procedure #:clean #:enforce) directory (string #!optional *) 
(list-of string)))
 (directory? (#(procedure #:clean #:enforce) directory? ((or string fixnum)) 
boolean))
 (duplicate-fileno (#(procedure #:clean #:enforce) duplicate-fileno (fixnum 
#!optional fixnum) fixnum))
 (errno/2big fixnum)
@@ -1583,9 +1586,9 @@
 (file-position (#(procedure #:clean #:enforce) file-position ((or port 
fixnum)) fixnum))
 (file-read (#(procedure #:clean #:enforce) file-read (fixnum fixnum #!optional 
*) list))
 (file-read-access? (#(procedure #:clean #:enforce) file-read-access? (string) 
boolean))
-(file-select (#(procedure #:clean #:enforce) file-select ((list fixnum) (list 
fixnum) #!optional fixnum) * *))
+(file-select (#(procedure #:clean #:enforce) file-select ((list-of fixnum) 
(list-of fixnum) #!optional fixnum) * *))
 (file-size (#(procedure #:clean #:enforce) file-size ((or string fixnum)) 
number))
-(file-stat (#(procedure #:clean #:enforce) file-stat ((or string fixnum) 
#!optional *) (vector number)))
+(file-stat (#(procedure #:clean #:enforce) file-stat ((or string fixnum) 
#!optional *) (vector-of number)))
 (file-test-lock (#(procedure #:clean #:enforce) file-test-lock (port 
#!optional fixnum *) boolean))
 (file-truncate (#(procedure #:clean #:enforce) file-truncate ((or string 
fixnum) fixnum) undefined))
 (file-type (#(procedure #:clean #:enforce) ((or string fixnum) #!optional * *) 
symbol))
@@ -1601,7 +1604,7 @@
 (glob (#(procedure #:clean #:enforce) glob (#!rest string) list))
 (group-information (#(procedure #:clean #:enforce) group-information (fixnum 
#!optional *) *))
 (initialize-groups (#(procedure #:clean #:enforce) initialize-groups (string 
fixnum) undefined))
-(local-time->seconds (#(procedure #:clean #:enforce) local-time->seconds 
((vector number)) number))
+(local-time->seconds (#(procedure #:clean #:enforce) local-time->seconds 
((vector fixnum fixnum fixnum fixnum fixnum fixnum fixnum fixnum boolean 
fixnum)) number))
 (local-timezone-abbreviation (#(procedure #:clean) local-timezone-abbreviation 
() string))
 (map-file-to-memory (#(procedure #:clean #:enforce) map-file-to-memory (* 
fixnum fixnum fixnum fixnum #!optional fixnum) (struct mmap)))
 (map/anonymous fixnum)
@@ -1648,15 +1651,15 @@
 (perm/ixusr fixnum)
 (pipe/buf fixnum)
 (port->fileno (#(procedure #:clean #:enforce) port->fileno (port) fixnum))
-(process (#(procedure #:clean #:enforce) process (string #!optional (list 
string) (list string)) port port fixnum))
-(process* (#(procedure #:clean #:enforce) process* (string #!optional (list 
string) (list string)) port port fixnum *))
+(process (#(procedure #:clean #:enforce) process (string #!optional (list-of 
string) (list-of string)) port port fixnum))
+(process* (#(procedure #:clean #:enforce) process* (string #!optional (list-of 
string) (list-of string)) port port fixnum *))
 
 (process-execute
- (#(procedure #:clean #:enforce) process-execute (string #!optional (list 
string) (list string)) noreturn))
+ (#(procedure #:clean #:enforce) process-execute (string #!optional (list-of 
string) (list-of string)) noreturn))
 
 (process-fork (#(procedure #:enforce) process-fork (#!optional (procedure () . 
*)) fixnum))
 (process-group-id (#(procedure #:clean #:enforce) process-group-id () fixnum))
-(process-run (#(procedure #:clean #:enforce) process-run (string #!optional 
(list string)) fixnum))
+(process-run (#(procedure #:clean #:enforce) process-run (string #!optional 
(list-of string)) fixnum))
 (process-signal (#(procedure #:clean #:enforce) process-signal (fixnum 
#!optional fixnum) undefined))
 (process-wait (#(procedure #:clean #:enforce) process-wait (fixnum #!optional 
*) fixnum fixnum fixnum))
 (prot/exec fixnum)
@@ -1665,9 +1668,9 @@
 (prot/write fixnum)
 (read-symbolic-link (#(procedure #:clean #:enforce) read-symbolic-link 
(string) string))
 (regular-file? (#(procedure #:clean #:enforce) regular-file? ((or string 
fixnum)) boolean))
-(seconds->local-time (#(procedure #:clean #:enforce) seconds->local-time 
(#!optional number) (vector number)))
+(seconds->local-time (#(procedure #:clean #:enforce) seconds->local-time 
(#!optional number) (vector fixnum fixnum fixnum fixnum fixnum fixnum fixnum 
fixnum boolean fixnum)))
 (seconds->string (#(procedure #:clean #:enforce) seconds->string (#!optional 
number) string))
-(seconds->utc-time (#(procedure #:clean #:enforce) seconds->utc-time 
(#!optional number) (vector number)))
+(seconds->utc-time (#(procedure #:clean #:enforce) seconds->utc-time 
(#!optional number) (vector fixnum fixnum fixnum fixnum fixnum fixnum fixnum 
fixnum boolean fixnum)))
 (seek/cur fixnum)
 (seek/end fixnum)
 (seek/set fixnum)
@@ -1677,7 +1680,7 @@
 (set-groups! (#(procedure #:clean #:enforce) set-groups! (list) undefined))
 (set-root-directory! (#(procedure #:clean #:enforce) set-root-directory! 
(string) undefined))
 (set-signal-handler! (#(procedure #:clean #:enforce) set-signal-handler! 
(fixnum (or boolean (procedure (fixnum) . *))) undefined))
-(set-signal-mask! (#(procedure #:clean #:enforce) set-signal-mask! ((list 
fixnum)) undefined))
+(set-signal-mask! (#(procedure #:clean #:enforce) set-signal-mask! ((list-of 
fixnum)) undefined))
 (setenv (#(procedure #:clean #:enforce) setenv (string string) undefined))
 (signal-handler (#(procedure #:clean #:enforce) signal-handler (fixnum) 
(procedure (fixnum) . *)))
 (signal-mask (#(procedure #:clean) signal-mask () fixnum))
@@ -1715,80 +1718,80 @@
 (character-device? (#(procedure #:clean #:enforce) character-device? ((or 
string fixnum)) boolean))
 (fifo? (#(procedure #:clean #:enforce) fifo? ((or string fixnum)) boolean))
 (socket? (#(procedure #:clean #:enforce) socket? ((or string fixnum)) boolean))
-(string->time (#(procedure #:clean #:enforce) string->time (string #!optional 
string) vector))
+(string->time (#(procedure #:clean #:enforce) string->time (string #!optional 
string) (vector fixnum fixnum fixnum fixnum fixnum fixnum fixnum fixnum boolean 
fixnum)))
 (symbolic-link? (#(procedure #:clean #:enforce) symbolic-link? ((or string 
fixnum)) boolean))
 (system-information (#(procedure #:clean) system-information () list))
 (terminal-name (#(procedure #:clean #:enforce) terminal-name (port) string))
 (terminal-port? (#(procedure #:clean #:enforce) terminal-port? (port) boolean))
 (terminal-size (#(procedure #:clean #:enforce) terminal-size (port) fixnum 
fixnum))
-(time->string (#(procedure #:clean #:enforce) time->string (vector #!optional 
string) string))
+(time->string (#(procedure #:clean #:enforce) time->string ((vector fixnum 
fixnum fixnum fixnum fixnum fixnum fixnum fixnum boolean fixnum) #!optional 
string) string))
 (unmap-file-from-memory (#(procedure #:clean #:enforce) unmap-file-from-memory 
((struct mmap) #!optional fixnum) undefined))
 (unsetenv (#(procedure #:clean #:enforce) unsetenv (string) undefined))
 (user-information (#(procedure #:clean #:enforce) user-information ((or string 
fixnum) #!optional *) *))
-(utc-time->seconds (#(procedure #:clean #:enforce) utc-time->seconds ((vector 
number)) number))
+(utc-time->seconds (#(procedure #:clean #:enforce) utc-time->seconds ((vector 
fixnum fixnum fixnum fixnum fixnum fixnum fixnum fixnum boolean fixnum)) 
number))
 (with-input-from-pipe (#(procedure #:enforce) with-input-from-pipe (string 
(procedure () . *) #!optional symbol) . *))
 (with-output-to-pipe (#(procedure #:enforce) with-output-to-pipe (string 
(procedure () . *) #!optional symbol) . *))
 
 
 ;; srfi-1
 
-(alist-cons (forall (a b c) (#(procedure #:clean) alist-cons (a b (list c)) 
(pair a (pair b (list c))))))
-(alist-copy (forall (a) (#(procedure #:clean #:enforce) alist-copy ((list a)) 
(list a))))
-(alist-delete (forall (a b) (#(procedure #:enforce) alist-delete (a (list b) 
#!optional (procedure (a b) *)) list)))
-(alist-delete! (forall (a b) (#(procedure #:enforce) alist-delete! (a (list b) 
#!optional (procedure (a b) *)) undefined)))
-(any (forall (a) (#(procedure #:enforce) any ((procedure (a #!rest) *) (list 
a) #!rest list) *)))
+(alist-cons (forall (a b c) (#(procedure #:clean) alist-cons (a b (list-of c)) 
(pair a (pair b (list-of c))))))
+(alist-copy (forall (a) (#(procedure #:clean #:enforce) alist-copy ((list-of 
a)) (list-of a))))
+(alist-delete (forall (a b) (#(procedure #:enforce) alist-delete (a (list-of 
b) #!optional (procedure (a b) *)) list)))
+(alist-delete! (forall (a b) (#(procedure #:enforce) alist-delete! (a (list-of 
b) #!optional (procedure (a b) *)) undefined)))
+(any (forall (a) (#(procedure #:enforce) any ((procedure (a #!rest) *) 
(list-of a) #!rest list) *)))
 (append! (#(procedure #:enforce) append! (#!rest list) list))
 
 (append-map
- (forall (a b) (#(procedure #:enforce) append-map ((procedure (a #!rest) (list 
b)) (list a) #!rest list)
-                          (list b))))
+ (forall (a b) (#(procedure #:enforce) append-map ((procedure (a #!rest) 
(list-of b)) (list-of a) #!rest list)
+                          (list-of b))))
 
 (append-map!
- (forall (a b) (#(procedure #:enforce) append-map! ((procedure (a #!rest) 
(list b)) (list a) #!rest list)
-                          (list b))))
+ (forall (a b) (#(procedure #:enforce) append-map! ((procedure (a #!rest) 
(list-of b)) (list-of a) #!rest list)
+                          (list-of b))))
 
 (append-reverse (#(procedure #:clean #:enforce) append-reverse (list list) 
list))
 (append-reverse! (#(procedure #:enforce) append-reverse! (list list) list))
-(break (forall (a) (#(procedure #:enforce) break ((procedure (a) *) (list a)) 
(list a) (list a))))
-(break! (forall (a) (#(procedure #:enforce) break! ((procedure (a) *) (list 
a)) (list a) (list a))))
+(break (forall (a) (#(procedure #:enforce) break ((procedure (a) *) (list-of 
a)) (list-of a) (list-of a))))
+(break! (forall (a) (#(procedure #:enforce) break! ((procedure (a) *) (list-of 
a)) (list-of a) (list-of a))))
 (car+cdr (forall (a b) (#(procedure #:clean #:enforce) car+cdr ((pair a b)) a 
b)))
 (circular-list (#(procedure #:clean) circular-list (#!rest) list))
 
 (circular-list? (#(procedure #:clean) circular-list? (*) boolean)
                ((null) (let ((#(tmp) #(1))) '#f)))
 
-(concatenate (#(procedure #:clean #:enforce) concatenate ((list list)) list))
-(concatenate! (#(procedure #:enforce) concatenate! ((list list)) list))
+(concatenate (#(procedure #:clean #:enforce) concatenate ((list-of list)) 
list))
+(concatenate! (#(procedure #:enforce) concatenate! ((list-of list)) list))
 (cons* (forall (a) (#(procedure #:clean) cons* (a #!rest) (pair a *))))
-(count (forall (a) (#(procedure #:enforce) count ((procedure (a #!rest) *) 
(list a) #!rest list) fixnum)))
-(delete (forall (a b) (#(procedure #:enforce) delete (a (list b) #!optional 
(procedure (a *) *)) (list b))))
-(delete! (forall (a b) (#(procedure #:enforce) delete! (a (list b) #!optional 
(procedure (a *) *)) (list b))))
+(count (forall (a) (#(procedure #:enforce) count ((procedure (a #!rest) *) 
(list-of a) #!rest list) fixnum)))
+(delete (forall (a b) (#(procedure #:enforce) delete (a (list-of b) #!optional 
(procedure (a *) *)) (list-of b))))
+(delete! (forall (a b) (#(procedure #:enforce) delete! (a (list-of b) 
#!optional (procedure (a *) *)) (list-of b))))
 
 (delete-duplicates
- (forall (a) (#(procedure #:enforce) delete-duplicates ((list a) #!optional 
(procedure (a *) *)) (list a))))
+ (forall (a) (#(procedure #:enforce) delete-duplicates ((list-of a) #!optional 
(procedure (a *) *)) (list-of a))))
 
 (delete-duplicates!
- (forall (a) (#(procedure #:enforce) delete-duplicates! ((list a) #!optional 
(procedure (a *) *)) (list a))))
+ (forall (a) (#(procedure #:enforce) delete-duplicates! ((list-of a) 
#!optional (procedure (a *) *)) (list-of a))))
 
 (dotted-list? (#(procedure #:clean) dotted-list? (*) boolean))
-(drop (forall (a) (#(procedure #:enforce) drop ((list a) fixnum) (list a))))
-(drop-right (forall (a) (#(procedure #:enforce) drop-right ((list a) fixnum) 
(list a))))
-(drop-right! (forall (a) (#(procedure #:enforce) drop-right! ((list a) fixnum) 
(list a))))
-(drop-while (forall (a) (#(procedure #:enforce) drop-while ((procedure (a) *) 
(list a)) (list a))))
+(drop (forall (a) (#(procedure #:enforce) drop ((list-of a) fixnum) (list-of 
a))))
+(drop-right (forall (a) (#(procedure #:enforce) drop-right ((list-of a) 
fixnum) (list-of a))))
+(drop-right! (forall (a) (#(procedure #:enforce) drop-right! ((list-of a) 
fixnum) (list-of a))))
+(drop-while (forall (a) (#(procedure #:enforce) drop-while ((procedure (a) *) 
(list-of a)) (list-of a))))
 (eighth (#(procedure #:clean #:enforce) eighth (pair) *))
 
 (every
- (forall (a) (#(procedure #:enforce) every ((procedure (a #!rest) *) (list a) 
#!rest list) *)))
+ (forall (a) (#(procedure #:enforce) every ((procedure (a #!rest) *) (list-of 
a) #!rest list) *)))
 
 (fifth (#(procedure #:clean #:enforce) fifth (pair) *))
-(filter (forall (a) (#(procedure #:enforce) filter ((procedure (a) *) (list 
a)) (list a))))
-(filter! (forall (a) (#(procedure #:enforce) filter! ((procedure (a) *) (list 
a)) (list a))))
+(filter (forall (a) (#(procedure #:enforce) filter ((procedure (a) *) (list-of 
a)) (list-of a))))
+(filter! (forall (a) (#(procedure #:enforce) filter! ((procedure (a) *) 
(list-of a)) (list-of a))))
 
 (filter-map
- (forall (a b) (#(procedure #:enforce) filter-map ((procedure (a #!rest) b) 
(list a) #!rest list) (list b))))
+ (forall (a b) (#(procedure #:enforce) filter-map ((procedure (a #!rest) b) 
(list-of a) #!rest list) (list-of b))))
 
-(find (forall (a) (#(procedure #:enforce) find ((procedure (a) *) (list a)) 
*)))
-(find-tail (forall (a) (#(procedure #:enforce) find-tail ((procedure (a) *) 
(list a)) *)))
+(find (forall (a) (#(procedure #:enforce) find ((procedure (a) *) (list-of a)) 
*)))
+(find-tail (forall (a) (#(procedure #:enforce) find-tail ((procedure (a) *) 
(list-of a)) *)))
 
 (first (forall (a) (#(procedure #:clean #:enforce) first ((pair a *)) a))
        ((pair) (##core#inline "C_u_i_car" #(1))))
@@ -1803,68 +1806,68 @@
                                       (##core#inline "C_u_i_cdr"
                                                      (##core#inline 
"C_u_i_cdr" #(1)))))))
 
-(iota (#(procedure #:clean #:enforce) iota (fixnum #!optional fixnum fixnum) 
(list number)))
+(iota (#(procedure #:clean #:enforce) iota (fixnum #!optional fixnum fixnum) 
(list-of number)))
 (last (#(procedure #:clean #:enforce) last (pair) *))
 (last-pair (#(procedure #:clean #:enforce) last-pair (pair) *))
 (length+ (#(procedure #:clean #:enforce) length+ (list) *))
-(list-copy (forall (a) (#(procedure #:clean #:enforce) list-copy ((list a)) 
(list a))))
-(list-index (forall (a) (#(procedure #:enforce) list-index ((procedure (a 
#!rest) *) (list a) #!rest list) *)))
-(list-tabulate (forall (a) (#(procedure #:enforce) list-tabulate (fixnum 
(procedure (fixnum) a)) (list a))))
+(list-copy (forall (a) (#(procedure #:clean #:enforce) list-copy ((list-of a)) 
(list-of a))))
+(list-index (forall (a) (#(procedure #:enforce) list-index ((procedure (a 
#!rest) *) (list-of a) #!rest list) *)))
+(list-tabulate (forall (a) (#(procedure #:enforce) list-tabulate (fixnum 
(procedure (fixnum) a)) (list-of a))))
 (list= (#(procedure #:clean #:enforce) list= (#!rest list) boolean))
 
 (lset-adjoin 
- (forall (a) (#(procedure #:enforce) lset-adjoin ((procedure (a a) *) (list a) 
#!rest a) (list a))))
+ (forall (a) (#(procedure #:enforce) lset-adjoin ((procedure (a a) *) (list-of 
a) #!rest a) (list-of a))))
 
 (lset-diff+intersection
  (forall (a)
-        (#(procedure #:enforce) lset-diff+intersection ((procedure (a a) *) 
(list a) #!rest (list a))
-                    (list a))))
+        (#(procedure #:enforce) lset-diff+intersection ((procedure (a a) *) 
(list-of a) #!rest (list-of a))
+                    (list-of a))))
 
 (lset-diff+intersection! 
  (forall (a)
-        (#(procedure #:enforce) lset-diff+intersection! ((procedure (a a) *) 
(list a) #!rest (list a))
-                    (list a))))
+        (#(procedure #:enforce) lset-diff+intersection! ((procedure (a a) *) 
(list-of a) #!rest (list-of a))
+                    (list-of a))))
 
 (lset-difference
- (forall (a) (#(procedure #:enforce) lset-difference ((procedure (a a) *) 
(list a) #!rest (list a)) (list a))))
+ (forall (a) (#(procedure #:enforce) lset-difference ((procedure (a a) *) 
(list-of a) #!rest (list-of a)) (list-of a))))
 
 (lset-difference!
- (forall (a) (#(procedure #:enforce) lset-difference! ((procedure (a a) *) 
(list a) #!rest (list a)) (list a))))
+ (forall (a) (#(procedure #:enforce) lset-difference! ((procedure (a a) *) 
(list-of a) #!rest (list-of a)) (list-of a))))
 
 (lset-intersection
- (forall (a) (#(procedure #:enforce) lset-intersection ((procedure (a a) *) 
(list a) #!rest (list a)) (list a))))
+ (forall (a) (#(procedure #:enforce) lset-intersection ((procedure (a a) *) 
(list-of a) #!rest (list-of a)) (list-of a))))
 
 (lset-intersection!
- (forall (a) (#(procedure #:enforce) lset-intersection! ((procedure (a a) *) 
(list a) #!rest (list a)) (list a))))
+ (forall (a) (#(procedure #:enforce) lset-intersection! ((procedure (a a) *) 
(list-of a) #!rest (list-of a)) (list-of a))))
 
 (lset-union
- (forall (a) (#(procedure #:enforce) lset-union ((procedure (a a) *) (list a) 
#!rest (list a)) (list a))))
+ (forall (a) (#(procedure #:enforce) lset-union ((procedure (a a) *) (list-of 
a) #!rest (list-of a)) (list-of a))))
 
 (lset-union!
- (forall (a) (#(procedure #:enforce) lset-union! ((procedure (a a) *) (list a) 
#!rest (list a)) (list a))))
+ (forall (a) (#(procedure #:enforce) lset-union! ((procedure (a a) *) (list-of 
a) #!rest (list-of a)) (list-of a))))
 
 (lset-xor
- (forall (a) (#(procedure #:enforce) lset-xor ((procedure (a a) *) (list a) 
#!rest (list a)) (list a))))
+ (forall (a) (#(procedure #:enforce) lset-xor ((procedure (a a) *) (list-of a) 
#!rest (list-of a)) (list-of a))))
 
 (lset-xor!
- (forall (a) (#(procedure #:enforce) lset-xor! ((procedure (a a) *) (list a) 
#!rest (list a)) (list a))))
+ (forall (a) (#(procedure #:enforce) lset-xor! ((procedure (a a) *) (list-of 
a) #!rest (list-of a)) (list-of a))))
 
 (lset<=
- (forall (a) (#(procedure #:enforce) lset<= ((procedure (a a) *) (list a) 
#!rest (list a)) boolean)))
+ (forall (a) (#(procedure #:enforce) lset<= ((procedure (a a) *) (list-of a) 
#!rest (list-of a)) boolean)))
 
 (lset=
- (forall (a) (#(procedure #:enforce) lset= ((procedure (a a) *) (list a) 
#!rest (list a)) boolean)))
+ (forall (a) (#(procedure #:enforce) lset= ((procedure (a a) *) (list-of a) 
#!rest (list-of a)) boolean)))
 
 ;; see note about "make-vector", above
 (make-list (forall (a) (#(procedure #:clean #:enforce) make-list (fixnum 
#!optional a) list)))
 
 (map!
- (forall (a b) (#(procedure #:enforce) map! ((procedure (a #!rest) b) (list a) 
#!rest list) (list b))))
+ (forall (a b) (#(procedure #:enforce) map! ((procedure (a #!rest) b) (list-of 
a) #!rest list) (list-of b))))
 
 (map-in-order
  (forall 
   (a b)
-  (#(procedure #:enforce) map-in-order ((procedure (a #!rest) b) (list a) 
#!rest list) (list b))))
+  (#(procedure #:enforce) map-in-order ((procedure (a #!rest) b) (list-of a) 
#!rest list) (list-of b))))
 
 (ninth (#(procedure #:clean #:enforce) ninth (pair) *))
 
@@ -1880,32 +1883,32 @@
 (pair-fold (#(procedure #:enforce) pair-fold (procedure * list #!rest list) 
*)) ;XXX do this
 (pair-fold-right (#(procedure #:enforce) pair-fold-right (procedure * list 
#!rest list) *)) ;XXX
 (pair-for-each (#(procedure #:enforce) pair-for-each ((procedure (#!rest) . *) 
list #!rest list) undefined)) ;XXX
-(partition (forall (a) (#(procedure #:enforce) partition ((procedure (a) *) 
(list a)) (list a) (list a))))
-(partition! (forall (a) (#(procedure #:enforce) partition! ((procedure (a) *) 
(list a)) (list a) (list a))))
+(partition (forall (a) (#(procedure #:enforce) partition ((procedure (a) *) 
(list-of a)) (list-of a) (list-of a))))
+(partition! (forall (a) (#(procedure #:enforce) partition! ((procedure (a) *) 
(list-of a)) (list-of a) (list-of a))))
 
 (proper-list? (#(procedure #:clean) proper-list? (*) boolean)
              ((null) (let ((#(tmp) #(1))) '#t)))
 
 (reduce (#(procedure #:enforce) reduce ((procedure (* *) *) * list) *)) ;XXX
 (reduce-right (#(procedure #:enforce) reduce-right ((procedure (* *) *) * 
list) *)) ;XXX
-(remove (forall (a) (#(procedure #:enforce) remove ((procedure (a) *) (list 
a)) (list a))))
-(remove! (forall (a) (#(procedure #:enforce) remove! ((procedure (a) *) (list 
a)) (list a))))
-(reverse! (forall (a) (#(procedure #:enforce) reverse! ((list a)) (list a))))
+(remove (forall (a) (#(procedure #:enforce) remove ((procedure (a) *) (list-of 
a)) (list-of a))))
+(remove! (forall (a) (#(procedure #:enforce) remove! ((procedure (a) *) 
(list-of a)) (list-of a))))
+(reverse! (forall (a) (#(procedure #:enforce) reverse! ((list-of a)) (list-of 
a))))
 
 (second (forall (a) (#(procedure #:clean #:enforce) second ((pair * (pair a 
*))) a))
        (((pair * (pair * *))) (##core#inline "C_u_i_car" (##core#inline 
"C_u_i_cdr" #(1)))))
 
 (seventh (#(procedure #:clean #:enforce) seventh (pair) *))
 (sixth (#(procedure #:clean #:enforce) sixth (pair) *))
-(span (forall (a) (#(procedure #:enforce) span ((procedure (a) *) (list a)) 
(list a) (list a))))
-(span! (forall (a) (#(procedure #:enforce) span! ((procedure (a) *) (list a)) 
(list a) (list a))))
-(split-at (forall (a) (#(procedure #:enforce) split-at ((list a) fixnum) (list 
a) (list a))))
-(split-at! (forall (a) (#(procedure #:enforce) split-at! ((list a) fixnum) 
(list a) (list a))))
-(take (forall (a) (#(procedure #:enforce) take ((list a) fixnum) (list a))))
-(take! (forall (a) (#(procedure #:enforce) take! ((list a) fixnum) (list a))))
-(take-right (forall (a) (#(procedure #:enforce) take-right ((list a) fixnum) 
(list a))))
-(take-while (forall (a) (#(procedure #:enforce) take-while ((procedure (a) *) 
(list a)) (list a))))
-(take-while! (forall (a) (#(procedure #:enforce) take-while! ((procedure (a) 
*) (list a)) (list a))))
+(span (forall (a) (#(procedure #:enforce) span ((procedure (a) *) (list-of a)) 
(list-of a) (list-of a))))
+(span! (forall (a) (#(procedure #:enforce) span! ((procedure (a) *) (list-of 
a)) (list-of a) (list-of a))))
+(split-at (forall (a) (#(procedure #:enforce) split-at ((list-of a) fixnum) 
(list-of a) (list-of a))))
+(split-at! (forall (a) (#(procedure #:enforce) split-at! ((list-of a) fixnum) 
(list-of a) (list-of a))))
+(take (forall (a) (#(procedure #:enforce) take ((list-of a) fixnum) (list-of 
a))))
+(take! (forall (a) (#(procedure #:enforce) take! ((list-of a) fixnum) (list-of 
a))))
+(take-right (forall (a) (#(procedure #:enforce) take-right ((list-of a) 
fixnum) (list-of a))))
+(take-while (forall (a) (#(procedure #:enforce) take-while ((procedure (a) *) 
(list-of a)) (list-of a))))
+(take-while! (forall (a) (#(procedure #:enforce) take-while! ((procedure (a) 
*) (list-of a)) (list-of a))))
 (tenth (#(procedure #:clean #:enforce) tenth (pair) *))
 
 (third (forall (a) (#(procedure #:clean #:enforce) third ((pair * (pair * 
(pair a *)))) a))
@@ -1915,16 +1918,16 @@
 
 (unfold (#(procedure #:enforce) unfold ((procedure (*) *) (procedure (*) *) 
(procedure (*) *) * #!optional (procedure (*) *)) *)) ;XXX
 (unfold-right (#(procedure #:enforce) unfold-right ((procedure (*) *) 
(procedure (*) *) (procedure (*) *) * #!optional (procedure (*) *)) *)) ;XXX
-(unzip1 (forall (a) (#(procedure #:clean #:enforce) unzip1 ((list (pair a *))) 
(list a))))
-(unzip2 (forall (a b) (#(procedure #:clean #:enforce) unzip2 ((list (pair a 
(pair b *)))) (list a) (list b))))
+(unzip1 (forall (a) (#(procedure #:clean #:enforce) unzip1 ((list-of (pair a 
*))) (list-of a))))
+(unzip2 (forall (a b) (#(procedure #:clean #:enforce) unzip2 ((list-of (pair a 
(pair b *)))) (list-of a) (list-of b))))
 
 (unzip3
- (forall (a b c) (#(procedure #:clean #:enforce) unzip3 ((list (pair a (pair b 
(pair c *))))) (list a) (list b) (list c))))
+ (forall (a b c) (#(procedure #:clean #:enforce) unzip3 ((list-of (pair a 
(pair b (pair c *))))) (list-of a) (list-of b) (list-of c))))
 
 (unzip4 (#(procedure #:clean #:enforce) unzip4 (list) list list list list)) ; 
yeah
 (unzip5 (#(procedure #:clean #:enforce) unzip5 (list) list list list list 
list)) ; yeah, too
 (xcons (forall (a b) (#(procedure #:pure) xcons (a b) (pair b a))))
-(zip (forall (a) (#(procedure #:clean #:enforce) zip ((list a) #!rest list) 
(list (pair a *)))))
+(zip (forall (a) (#(procedure #:clean #:enforce) zip ((list-of a) #!rest list) 
(list-of (pair a *)))))
 
 
 ;; srfi-13
@@ -1962,10 +1965,10 @@
 
 (string-compare (#(procedure #:enforce) string-compare (string string 
(procedure (fixnum) *) (procedure (fixnum) *) (procedure (fixnum) *) #!optional 
fixnum fixnum fixnum fixnum) *))
 (string-compare-ci (#(procedure #:enforce) string-compare (string string 
(procedure (fixnum) *) (procedure (fixnum) *) (procedure (fixnum) *) #!optional 
fixnum fixnum fixnum fixnum) *))
-(string-concatenate (#(procedure #:clean #:enforce) string-concatenate ((list 
string)) string))
-(string-concatenate-reverse (#(procedure #:clean #:enforce) 
string-concatenate-reverse ((list string) #!optional string fixnum) string))
-(string-concatenate-reverse/shared (#(procedure #:clean #:enforce) 
string-concatenate-reverse/shared ((list string) #!optional string fixnum) 
string))
-(string-concatenate/shared (#(procedure #:clean #:enforce) 
string-concatenate/shared ((list string)) string))
+(string-concatenate (#(procedure #:clean #:enforce) string-concatenate 
((list-of string)) string))
+(string-concatenate-reverse (#(procedure #:clean #:enforce) 
string-concatenate-reverse ((list-of string) #!optional string fixnum) string))
+(string-concatenate-reverse/shared (#(procedure #:clean #:enforce) 
string-concatenate-reverse/shared ((list-of string) #!optional string fixnum) 
string))
+(string-concatenate/shared (#(procedure #:clean #:enforce) 
string-concatenate/shared ((list-of string)) string))
 (string-contains (#(procedure #:clean #:enforce) string-contains (string 
string #!optional fixnum fixnum fixnum fixnum) (or fixnum boolean)))
 (string-contains-ci (#(procedure #:clean #:enforce) string-contains-ci (string 
string #!optional fixnum fixnum fixnum fixnum) (or fixnum boolean)))
 (string-copy (#(procedure #:clean #:enforce) string-copy (string #!optional 
fixnum fixnum) string))
@@ -2167,8 +2170,8 @@
 (char-set? (#(procedure #:pure #:predicate (struct char-set)) char-set? (*) 
boolean))
 
 (end-of-char-set? (#(procedure #:clean #:enforce) end-of-char-set? (fixnum) 
boolean))
-(list->char-set (#(procedure #:clean #:enforce) list->char-set (list 
#!optional (struct char-set)) (struct char-set)))
-(list->char-set! (#(procedure #:clean #:enforce) list->char-set! (list 
#!optional (struct char-set)) (struct char-set)))
+(list->char-set (#(procedure #:clean #:enforce) list->char-set ((list-of char) 
#!optional (struct char-set)) (struct char-set)))
+(list->char-set! (#(procedure #:clean #:enforce) list->char-set! ((list-of 
char) #!optional (struct char-set)) (struct char-set)))
 (string->char-set (#(procedure #:clean #:enforce) string->char-set (string 
#!optional (struct char-set)) (struct char-set)))
 (string->char-set! (#(procedure #:clean #:enforce) string->char-set! (string 
#!optional (struct char-set)) (struct char-set)))
 (ucs-range->char-set (#(procedure #:clean #:enforce) ucs-range->char-set 
(fixnum fixnum #!optional * (struct char-set)) (struct char-set)))
@@ -2276,7 +2279,7 @@
 (f32vector (#(procedure #:clean #:enforce) f32vector (#!rest number) (struct 
f32vector)))
 (f32vector->blob (#(procedure #:clean #:enforce) f32vector->blob ((struct 
f32vector)) blob))
 (f32vector->blob/shared (#(procedure #:clean #:enforce) f32vector->blob/shared 
((struct f32vector)) blob))
-(f32vector->list (#(procedure #:clean #:enforce) f32vector->list ((struct 
f32vector)) (list float)))
+(f32vector->list (#(procedure #:clean #:enforce) f32vector->list ((struct 
f32vector)) (list-of float)))
 
 (f32vector-length (#(procedure #:clean #:enforce) f32vector-length ((struct 
f32vector)) fixnum)
                  (((struct f32vector)) (##core#inline "C_u_i_32vector_length" 
#(1))))
@@ -2289,7 +2292,7 @@
 (f64vector (#(procedure #:clean #:enforce) f64vector (#!rest number) (struct 
f64vector)))
 (f64vector->blob (#(procedure #:clean #:enforce) f64vector->blob ((struct 
f32vector)) blob))
 (f64vector->blob/shared (#(procedure #:clean #:enforce) f64vector->blob/shared 
((struct f64vector)) blob))
-(f64vector->list (#(procedure #:clean #:enforce) f64vector->list ((struct 
f64vector)) (list float)))
+(f64vector->list (#(procedure #:clean #:enforce) f64vector->list ((struct 
f64vector)) (list-of float)))
 
 (f64vector-length (#(procedure #:clean #:enforce) f64vector-length ((struct 
f64vector)) fixnum)
                  (((struct f32vector)) (##core#inline "C_u_i_64vector_length" 
#(1))))
@@ -2299,14 +2302,14 @@
 
 (f64vector? (#(procedure #:pure #:predicate (struct f64vector)) f64vector? (*) 
boolean))
 
-(list->f32vector (#(procedure #:clean #:enforce) list->f32vector ((list 
number)) (struct f32vector)))
-(list->f64vector (#(procedure #:clean #:enforce) list->f64vector ((list 
number)) (struct f64vector)))
-(list->s16vector (#(procedure #:clean #:enforce) list->s16vector ((list 
fixnum)) (struct s16vector)))
-(list->s32vector (#(procedure #:clean #:enforce) list->s32vector ((list 
number)) (struct s32vector)))
-(list->s8vector (#(procedure #:clean #:enforce) list->s8vector ((list fixnum)) 
(struct s8vector)))
-(list->u16vector (#(procedure #:clean #:enforce) list->u16vector ((list 
fixnum)) (struct u16vector)))
-(list->u32vector (#(procedure #:clean #:enforce) list->u32vector ((list 
number)) (struct u32vector)))
-(list->u8vector (#(procedure #:clean #:enforce) list->u8vector ((list fixnum)) 
(struct u8vector)))
+(list->f32vector (#(procedure #:clean #:enforce) list->f32vector ((list-of 
number)) (struct f32vector)))
+(list->f64vector (#(procedure #:clean #:enforce) list->f64vector ((list-of 
number)) (struct f64vector)))
+(list->s16vector (#(procedure #:clean #:enforce) list->s16vector ((list-of 
fixnum)) (struct s16vector)))
+(list->s32vector (#(procedure #:clean #:enforce) list->s32vector ((list-of 
number)) (struct s32vector)))
+(list->s8vector (#(procedure #:clean #:enforce) list->s8vector ((list-of 
fixnum)) (struct s8vector)))
+(list->u16vector (#(procedure #:clean #:enforce) list->u16vector ((list-of 
fixnum)) (struct u16vector)))
+(list->u32vector (#(procedure #:clean #:enforce) list->u32vector ((list-of 
number)) (struct u32vector)))
+(list->u8vector (#(procedure #:clean #:enforce) list->u8vector ((list-of 
fixnum)) (struct u8vector)))
 (make-f32vector (#(procedure #:clean #:enforce) make-f32vector (fixnum 
#!optional * * *) (struct f32vector)))
 (make-f64vector (#(procedure #:clean #:enforce) make-f64vector (fixnum 
#!optional * * *) (struct f64vector)))
 (make-s16vector (#(procedure #:clean #:enforce) make-s16vector (fixnum 
#!optional * * *) (struct s16vector)))
@@ -2321,7 +2324,7 @@
 (s16vector (#(procedure #:clean #:enforce) s16vector (#!rest fixnum) (struct 
s16vector)))
 (s16vector->blob (#(procedure #:clean #:enforce) s16vector->blob ((struct 
s16vector)) blob))
 (s16vector->blob/shared (#(procedure #:clean #:enforce) s16vector->blob/shared 
((struct s16vector)) blob))
-(s16vector->list (#(procedure #:clean #:enforce) s16vector->list ((struct 
s16vector)) (list fixnum)))
+(s16vector->list (#(procedure #:clean #:enforce) s16vector->list ((struct 
s16vector)) (list-of fixnum)))
 
 (s16vector-length (#(procedure #:clean #:enforce) s16vector-length ((struct 
s16vector)) fixnum)
                  (((struct s16vector)) (##core#inline "C_u_i_16vector_length" 
#(1))))
@@ -2334,7 +2337,7 @@
 (s32vector (#(procedure #:clean #:enforce) s32vector (#!rest number) (struct 
s32vector)))
 (s32vector->blob (#(procedure #:clean #:enforce) s32vector->blob ((struct 
32vector)) blob))
 (s32vector->blob/shared (#(procedure #:clean #:enforce) s32vector->blob/shared 
((struct s32vector)) blob))
-(s32vector->list (#(procedure #:clean #:enforce) s32vector->list ((struct 
s32vector)) (list number)))
+(s32vector->list (#(procedure #:clean #:enforce) s32vector->list ((struct 
s32vector)) (list-of number)))
 
 (s32vector-length (#(procedure #:clean #:enforce) s32vector-length ((struct 
s32vector)) fixnum)
                  (((struct s32vector)) (##core#inline "C_u_i_32vector_length" 
#(1))))
@@ -2347,7 +2350,7 @@
 (s8vector (#(procedure #:clean #:enforce) s8vector (#!rest fixnum) (struct 
s8vector)))
 (s8vector->blob (#(procedure #:clean #:enforce) s8vector->blob ((struct 
s8vector)) blob))
 (s8vector->blob/shared (#(procedure #:clean #:enforce) s8vector->blob/shared 
((struct s8vector)) blob))
-(s8vector->list (#(procedure #:clean #:enforce) s8vector->list ((struct 
s8vector)) (list fixnum)))
+(s8vector->list (#(procedure #:clean #:enforce) s8vector->list ((struct 
s8vector)) (list-of fixnum)))
 
 (s8vector-length (#(procedure #:clean #:enforce) s8vector-length ((struct 
s8vector)) fixnum)
                 (((struct s8vector)) (##core#inline "C_u_i_8vector_length" 
#(1))))
@@ -2368,7 +2371,7 @@
 (u16vector (#(procedure #:clean #:enforce) u16vector (#!rest fixnum) (struct 
u16vector)))
 (u16vector->blob (#(procedure #:clean #:enforce) u16vector->blob ((struct 
u16vector)) blob))
 (u16vector->blob/shared (#(procedure #:clean #:enforce) u16vector->blob/shared 
((struct u16vector)) blob))
-(u16vector->list (#(procedure #:clean #:enforce) u16vector->list ((struct 
u16vector)) (list fixnum)))
+(u16vector->list (#(procedure #:clean #:enforce) u16vector->list ((struct 
u16vector)) (list-of fixnum)))
 
 (u16vector-length (#(procedure #:clean #:enforce) u16vector-length ((struct 
u16vector)) fixnum)
                  (((struct u16vector)) (##core#inline "C_u_i_16vector_length" 
#(1))))
@@ -2381,7 +2384,7 @@
 (u32vector (#(procedure #:clean #:enforce) u32vector (#!rest number) (struct 
u32vector)))
 (u32vector->blob (#(procedure #:clean #:enforce) u32vector->blob ((struct 
u32vector)) blob))
 (u32vector->blob/shared (#(procedure #:clean #:enforce) u32vector->blob/shared 
((struct u32vector)) blob))
-(u32vector->list (#(procedure #:clean #:enforce) u32vector->list ((struct 
u32vector)) (list number)))
+(u32vector->list (#(procedure #:clean #:enforce) u32vector->list ((struct 
u32vector)) (list-of number)))
 
 (u32vector-length (#(procedure #:clean #:enforce) u32vector-length ((struct 
u32vector)) fixnum)
                  (((struct u32vector)) (##core#inline "C_u_i_32vector_length" 
#(1))))
@@ -2394,7 +2397,7 @@
 (u8vector (#(procedure #:clean #:enforce) u8vector (#!rest fixnum) (struct 
u8vector)))
 (u8vector->blob (#(procedure #:clean #:enforce) u8vector->blob ((struct 
u8vector)) blob))
 (u8vector->blob/shared (#(procedure #:clean #:enforce) u8vector->blob/shared 
((struct u8vector)) blob))
-(u8vector->list (#(procedure #:clean #:enforce) u8vector->list ((struct 
u8vector)) (list fixnum)))
+(u8vector->list (#(procedure #:clean #:enforce) u8vector->list ((struct 
u8vector)) (list-of fixnum)))
 
 (u8vector-length (#(procedure #:clean #:enforce) u8vector-length ((struct 
u8vector)) fixnum)
                 (((struct u8vector)) (##core#inline "C_u_i_8vector_length" 
#(1))))
@@ -2409,13 +2412,13 @@
 
 ;; srfi-69
 
-(alist->hash-table (#(procedure #:clean #:enforce) alist->hash-table ((list 
pair) #!rest) (struct hash-table)))
+(alist->hash-table (#(procedure #:clean #:enforce) alist->hash-table ((list-of 
pair) #!rest) (struct hash-table)))
 (eq?-hash (#(procedure #:clean #:enforce) eq?-hash (* #!optional fixnum) 
fixnum))
 (equal?-hash (#(procedure #:clean #:enforce) equal?-hash (* #!optional fixnum) 
fixnum))
 (eqv?-hash (#(procedure #:clean #:enforce) eqv?-hash (* #!optional fixnum) 
fixnum))
 (hash (#(procedure #:pure #:enforce) hash (* #!optional fixnum) fixnum))
 (hash-by-identity (#(procedure #:pure #:enforce) hash-by-identity (* 
#!optional fixnum) fixnum))
-(hash-table->alist (#(procedure #:clean #:enforce) hash-table->alist ((struct 
hash-table)) (list pair)))
+(hash-table->alist (#(procedure #:clean #:enforce) hash-table->alist ((struct 
hash-table)) (list-of pair)))
 (hash-table-clear! (#(procedure #:clean #:enforce) hash-table-clear! ((struct 
hash-table)) undefined))
 (hash-table-copy (#(procedure #:clean #:enforce) hash-table-copy ((struct 
hash-table)) (struct hash-table)))
 (hash-table-delete! (#(procedure #:clean #:enforce) hash-table-delete! 
((struct hash-table) *) boolean))
@@ -2510,6 +2513,6 @@
 (system* (#(procedure #:clean #:enforce) system* (string #!rest) undefined))
 (qs (#(procedure #:clean #:enforce) qs (string) string))
 (compile-file (#(procedure #:clean #:enforce) compile-file (string #!rest) (or 
boolean string)))
-(compile-file-options (#(procedure #:clean #:enforce) compile-file-options 
(#!optional (list string)) (list string)))
+(compile-file-options (#(procedure #:clean #:enforce) compile-file-options 
(#!optional (list-of string)) (list-of string)))
 (scan-input-lines (#(procedure #:enforce) scan-input-lines (* #!optional port) 
*))
 (yes-or-no? (#(procedure #:enforce) yes-or-no? (string #!rest) *))

reply via email to

[Prev in Thread] Current Thread [Next in Thread]