~ chicken-core (chicken-5) 7e66907fe883908836959131ed3f1473d7a441f0


commit 7e66907fe883908836959131ed3f1473d7a441f0
Author:     felix <felix@call-with-current-continuation.org>
AuthorDate: Fri Aug 26 23:53:51 2011 +0200
Commit:     felix <felix@call-with-current-continuation.org>
CommitDate: Fri Aug 26 23:53:51 2011 +0200

    mark procedures as clean/pure

diff --git a/compiler.scm b/compiler.scm
index a73202e8..0ac5a0f7 100644
--- a/compiler.scm
+++ b/compiler.scm
@@ -82,14 +82,15 @@
 ;   ##compiler#always-bound-to-procedure -> BOOL
 ;   ##compiler#local -> BOOL
 ;   ##compiler#visibility -> #f | 'hidden | 'exported
-;   ##compiler#constant -> BOOL
+;   ##compiler#constant -> BOOL                             defined as constant
 ;   ##compiler#intrinsic -> #f | 'standard | 'extended
 ;   ##compiler#inline -> 'no | 'yes
 ;   ##compiler#inline-global -> 'yes | 'no | <node>
 ;   ##compiler#profile -> BOOL
 ;   ##compiler#unused -> BOOL
 ;   ##compiler#foldable -> BOOL
-;   ##compiler#pure -> 'standard | 'extended | BOOL
+;   ##compiler#pure -> BOOL                                 referentially transparent
+;   ##compiler#clean -> BOOL                                does not modify local state
 ;   ##compiler#type -> TYPE
 ;   ##compiler#declared-type -> BOOL
 
diff --git a/scrutinizer.scm b/scrutinizer.scm
index ea53599d..9a79873f 100755
--- a/scrutinizer.scm
+++ b/scrutinizer.scm
@@ -661,7 +661,9 @@
 		      (define (smash)
 			(when (and (not strict-variable-types)
 				   (or (not pn)
-				       (not (variable-mark pn '##compiler#pure))))
+				       (and
+					(not (variable-mark pn '##compiler#pure))
+					(not (variable-mark pn '##compiler#clean)))))
 			  (smash-component-types! e "env")
 			  (smash-component-types! blist "blist")))
 		      (cond (specialized?
@@ -1529,6 +1531,9 @@
 ;;; type-db processing
 
 (define (load-type-database name #!optional (path (repository-path)))
+  (define (clean! name)
+    (when enable-specialization 
+      (mark-variable name '##compiler#clean #t)))
   (define (pure! name)
     (when enable-specialization 
       (mark-variable name '##compiler#pure #t)))
@@ -1552,6 +1557,9 @@
 				    ((#:pure)
 				     (pure! name)
 				     (loop (cdr props)))
+				    ((#:clean)
+				     (clean! name)
+				     (loop (cdr props)))
 				    ((#:enforce)
 				     (mark-variable name '##compiler#enforce #t)
 				     (loop (cdr props)))
@@ -1608,6 +1616,7 @@
 		 (type (variable-mark sym '##compiler#type))
 		 (pred (variable-mark sym '##compiler#predicate))
 		 (pure (variable-mark sym '##compiler#pure))
+		 (clean (variable-mark sym '##compiler#clean))
 		 (enforce (variable-mark sym '##compiler#enforce)))
 	     (pp (cons*
 		  sym
@@ -1618,7 +1627,8 @@
 			   `(#(procedure
 			       ,@(if enforce '(#:enforce) '())
 			       ,@(if pred `(#:predicate ,pred) '())
-			       ,@(if pure '(#:pure) '()))
+			       ,@(if pure '(#:pure) '())
+			       ,@(if clean '(#:clean) '()))
 			     ,@(cdr type)))
 			  ((forall)
 			   `(forall ,(second type) ,(wrap (third type))))
@@ -1668,12 +1678,12 @@
   ;; - converts some typenames to struct types (u32vector, etc.)
   ;; - drops "#!key ..." args by converting to #!rest
   ;; - handles "(T1 -> T2 : T3)" (predicate) 
-  ;; - handles "(T1 --> T2 [: T3])" (pure)
+  ;; - handles "(T1 --> T2 [: T3])" (clean)
   ;; - simplifies result
   ;; - coalesces all "forall" forms into one (remove "forall" if typevar-set is empty)
   ;; - renames type-variables
   (let ((ptype #f)			; (T . PT) | #f
-	(pure #f)
+	(clean #f)
 	(usedvars '())
 	(typevars '()))
     (define (upto lst p)
@@ -1739,9 +1749,9 @@
 	     (and (= 2 (length t)) (symbol? (second t))))
 	    ((or (memq '--> t) (memq '-> t)) =>
 	     (lambda (p)
-	       (let* ((puref (eq? '--> (car p)))
-		      (ok (or (not rec) (not puref))))
-		 (set! pure puref)
+	       (let* ((cleanf (eq? '--> (car p)))
+		      (ok (or (not rec) (not cleanf))))
+		 (set! clean cleanf)
 		 (let ((cp (memq ': (cdr p))))
 		   (cond ((not cp)
 			  (and ok
@@ -1801,7 +1811,7 @@
 	       (values 
 		type 
 		(and ptype (eq? (car ptype) type) (cdr ptype))
-		pure))))
+		clean))))
 	  (else (values #f #f #f)))))
 
 (define (install-specializations name specs)
diff --git a/types.db b/types.db
index c7c91ef3..865e3cb3 100644
--- a/types.db
+++ b/types.db
@@ -34,99 +34,102 @@
 ;   all remaining arguments
 ; - in templates "#(SYMBOL)" binds X to a temporary gensym'd variable, further references
 ;   to "#(SYMBOL)" allow backreferences to this generated identifier
+; - "#:clean" means: will not invoke procedures that modify local variables and
+;   will not modify list or vector data held locally (note that I/O may invoke
+;   port handlers)
 
 
 ;; scheme
 
-(not (procedure not (*) boolean)
+(not (#(procedure #:pure) not (*) boolean)
      (((not boolean)) (let ((#(tmp) #(1))) '#t)))
 
-(boolean? (#(procedure #:predicate boolean) boolean? (*) boolean))
+(boolean? (#(procedure #:pure #:predicate boolean) boolean? (*) boolean))
 
-(eq? (procedure eq? (* *) boolean))
+(eq? (#(procedure #:pure) eq? (* *) boolean))
 
-(eqv? (procedure eqv? (* *) boolean)
+(eqv? (#(procedure #:pure) eqv? (* *) boolean)
       (((not float) *) (eq? #(1) #(2)))
       ((* (not float)) (eq? #(1) #(2))))
 
-(equal? (procedure equal? (* *) boolean)
+(equal? (#(procedure #:pure) equal? (* *) boolean)
 	(((or fixnum symbol char eof null) *) (eq? #(1) #(2)))
 	((* (or fixnum symbol char eof null)) (eq? #(1) #(2))))
 
-(pair? (#(procedure #:predicate pair) pair? (*) boolean))
+(pair? (#(procedure #:pure #:predicate pair) pair? (*) boolean))
 
-(cons (forall (a b) (#(procedure #:pure #:enforce) cons (a b) (pair a b))))
+(cons (forall (a b) (#(procedure #:pure) cons (a b) (pair a b))))
 
-(##sys#cons (forall (a b) (procedure ##sys#cons (a b) (pair a b))))
+(##sys#cons (forall (a b) (#(procedure #:pure) ##sys#cons (a b) (pair a b))))
 
-(car (forall (a) (#(procedure #:enforce) car ((pair a *)) a)) ((pair) (##core#inline "C_u_i_car" #(1))))
-(cdr (forall (a) (#(procedure #:enforce) cdr ((pair * a)) a)) ((pair) (##core#inline "C_u_i_cdr" #(1))))
+(car (forall (a) (#(procedure #:clean #:enforce) car ((pair a *)) a)) ((pair) (##core#inline "C_u_i_car" #(1))))
+(cdr (forall (a) (#(procedure #:clean #:enforce) cdr ((pair * a)) a)) ((pair) (##core#inline "C_u_i_cdr" #(1))))
 
-(caar (forall (a) (#(procedure #:enforce) caar ((pair (pair a *) *)) a))
+(caar (forall (a) (#(procedure #:clean #:enforce) caar ((pair (pair a *) *)) a))
       (((pair (pair * *) *)) (##core#inline "C_u_i_car" (##core#inline "C_u_i_car" #(1)))))
-(cadr (forall (a) (#(procedure #:enforce) cadr ((pair * (pair a *))) a))
+(cadr (forall (a) (#(procedure #:clean #:enforce) cadr ((pair * (pair a *))) a))
       (((pair * (pair * *))) (##core#inline "C_u_i_car" (##core#inline "C_u_i_cdr" #(1)))))
-(cdar (forall (a) (#(procedure #:enforce) cdar ((pair (pair * a) *)) a))
+(cdar (forall (a) (#(procedure #:clean #:enforce) cdar ((pair (pair * a) *)) a))
       (((pair (pair * *) *)) (##core#inline "C_u_i_cdr" (##core#inline "C_u_i_car" #(1)))))
-(cddr (forall (a) (#(procedure #:enforce) cddr ((pair * (pair * a))) a))
+(cddr (forall (a) (#(procedure #:clean #:enforce) cddr ((pair * (pair * a))) a))
       (((pair * (pair * *))) (##core#inline "C_u_i_cdr" (##core#inline "C_u_i_cdr" #(1)))))
 
-(caaar (forall (a) (#(procedure #:enforce) caaar ((pair (pair (pair a *) *) *)) a))
+(caaar (forall (a) (#(procedure #:clean #:enforce) caaar ((pair (pair (pair a *) *) *)) a))
        (((pair (pair (pair * *) *) *))
 	(##core#inline "C_u_i_car"
 		       (##core#inline "C_u_i_car" (##core#inline "C_u_i_car" #(1))))))
 
-(caadr (forall (a) (#(procedure #:enforce) caadr ((pair * (pair (pair a *) *))) a))
+(caadr (forall (a) (#(procedure #:clean #:enforce) caadr ((pair * (pair (pair a *) *))) a))
        (((pair * (pair (pair * *) *)))
 	(##core#inline "C_u_i_car"
 		       (##core#inline "C_u_i_car" (##core#inline "C_u_i_cdr" #(1))))))
 
-(cadar (forall (a) (#(procedure #:enforce) cadar ((pair (pair * (pair a *)) *)) a))
+(cadar (forall (a) (#(procedure #:clean #:enforce) cadar ((pair (pair * (pair a *)) *)) a))
        (((pair (pair * (pair * *)) *))
 	(##core#inline "C_u_i_car"
 		       (##core#inline "C_u_i_cdr" (##core#inline "C_u_i_car" #(1))))))
 
-(caddr (forall (a) (#(procedure #:enforce) caddr ((pair * (pair * (pair a *)))) a))
+(caddr (forall (a) (#(procedure #:clean #:enforce) caddr ((pair * (pair * (pair a *)))) a))
        (((pair * (pair * (pair * *))))
 	(##core#inline "C_u_i_car"
 		       (##core#inline "C_u_i_cdr" (##core#inline "C_u_i_cdr" #(1))))))
 
-(cdaar (forall (a) (#(procedure #:enforce) cdaar ((pair (pair (pair * a) *) *)) a))
+(cdaar (forall (a) (#(procedure #:clean #:enforce) cdaar ((pair (pair (pair * a) *) *)) a))
        (((pair (pair (pair * *) *) *))
 	(##core#inline "C_u_i_cdr"
 		       (##core#inline "C_u_i_car" (##core#inline "C_u_i_car" #(1))))))
 
-(cdadr (forall (a) (#(procedure #:enforce) cdadr ((pair * (pair (pair * a) *))) a))
+(cdadr (forall (a) (#(procedure #:clean #:enforce) cdadr ((pair * (pair (pair * a) *))) a))
        (((pair * (pair (pair * *) *)))
 	(##core#inline "C_u_i_cdr"
 		       (##core#inline "C_u_i_car" (##core#inline "C_u_i_cdr" #(1))))))
 
-(cddar (forall (a) (#(procedure #:enforce) cddar ((pair (pair * (pair * a)) *)) a))
+(cddar (forall (a) (#(procedure #:clean #:enforce) cddar ((pair (pair * (pair * a)) *)) a))
        (((pair (pair * (pair * *)) *))
 	(##core#inline "C_u_i_cdr"
 		       (##core#inline "C_u_i_cdr" (##core#inline "C_u_i_car" #(1))))))
 
-(cdddr (forall (a) (#(procedure #:enforce) cdddr ((pair * (pair * (pair * a)))) a))
+(cdddr (forall (a) (#(procedure #:clean #:enforce) cdddr ((pair * (pair * (pair * a)))) a))
        (((pair * (pair * (pair * *))))
 	(##core#inline "C_u_i_cdr"
 		       (##core#inline "C_u_i_cdr" (##core#inline "C_u_i_cdr" #(1))))))
 
-(caaaar (forall (a) (#(procedure #:enforce) caaaar ((pair (pair (pair (pair a *) *) *) *)) a)))
-(caaadr (forall (a) (#(procedure #:enforce) caaadr ((pair * (pair (pair (pair a *) *) *))) a)))
-(caadar (forall (a) (#(procedure #:enforce) caadar ((pair (pair * (pair (pair a *) *)) *)) a)))
-(caaddr (forall (a) (#(procedure #:enforce) caaddr ((pair * (pair * (pair (pair a *) *)))) a)))
-(cadaar (forall (a) (#(procedure #:enforce) cadaar ((pair (pair (pair * (pair a *)) *) *)) a)))
-(cadadr (forall (a) (#(procedure #:enforce) cadadr ((pair * (pair (pair * (pair a *)) *))) a)))
-(caddar (forall (a) (#(procedure #:enforce) caddar ((pair (pair * (pair * (pair a *))) *)) a)))
-(cadddr (forall (a) (#(procedure #:enforce) cadddr ((pair * (pair * (pair * (pair a *))))) a)))
-(cdaaar (forall (a) (#(procedure #:enforce) cdaaar ((pair (pair (pair (pair * a) *) *) *)) a)))
-(cdaadr (forall (a) (#(procedure #:enforce) cdaadr ((pair * (pair (pair (pair * a) *) *))) a)))
-(cdadar (forall (a) (#(procedure #:enforce) cdadar ((pair (pair * (pair (pair * a) *)) *)) a)))
-(cdaddr (forall (a) (#(procedure #:enforce) cdaddr ((pair * (pair * (pair (pair * a) *)))) a)))
-(cddaar (forall (a) (#(procedure #:enforce) cddaar ((pair (pair (pair * (pair * a)) *) *)) a)))
-(cddadr (forall (a) (#(procedure #:enforce) cddadr ((pair * (pair (pair * (pair * a)) *))) a)))
-(cdddar (forall (a) (#(procedure #:enforce) cdddar ((pair (pair * (pair * (pair * a))) *)) a)))
-(cddddr (forall (a) (#(procedure #:enforce) cddddr ((pair * (pair * (pair * (pair * a))))) a)))
+(caaaar (forall (a) (#(procedure #:clean #:enforce) caaaar ((pair (pair (pair (pair a *) *) *) *)) a)))
+(caaadr (forall (a) (#(procedure #:clean #:enforce) caaadr ((pair * (pair (pair (pair a *) *) *))) a)))
+(caadar (forall (a) (#(procedure #:clean #:enforce) caadar ((pair (pair * (pair (pair a *) *)) *)) a)))
+(caaddr (forall (a) (#(procedure #:clean #:enforce) caaddr ((pair * (pair * (pair (pair a *) *)))) a)))
+(cadaar (forall (a) (#(procedure #:clean #:enforce) cadaar ((pair (pair (pair * (pair a *)) *) *)) a)))
+(cadadr (forall (a) (#(procedure #:clean #:enforce) cadadr ((pair * (pair (pair * (pair a *)) *))) a)))
+(caddar (forall (a) (#(procedure #:clean #:enforce) caddar ((pair (pair * (pair * (pair a *))) *)) a)))
+(cadddr (forall (a) (#(procedure #:clean #:enforce) cadddr ((pair * (pair * (pair * (pair a *))))) a)))
+(cdaaar (forall (a) (#(procedure #:clean #:enforce) cdaaar ((pair (pair (pair (pair * a) *) *) *)) a)))
+(cdaadr (forall (a) (#(procedure #:clean #:enforce) cdaadr ((pair * (pair (pair (pair * a) *) *))) a)))
+(cdadar (forall (a) (#(procedure #:clean #:enforce) cdadar ((pair (pair * (pair (pair * a) *)) *)) a)))
+(cdaddr (forall (a) (#(procedure #:clean #:enforce) cdaddr ((pair * (pair * (pair (pair * a) *)))) a)))
+(cddaar (forall (a) (#(procedure #:clean #:enforce) cddaar ((pair (pair (pair * (pair * a)) *) *)) a)))
+(cddadr (forall (a) (#(procedure #:clean #:enforce) cddadr ((pair * (pair (pair * (pair * a)) *))) a)))
+(cdddar (forall (a) (#(procedure #:clean #:enforce) cdddar ((pair (pair * (pair * (pair * a))) *)) a)))
+(cddddr (forall (a) (#(procedure #:clean #:enforce) cddddr ((pair * (pair * (pair * (pair * a))))) a)))
 
 (set-car! (#(procedure #:enforce) set-car! (pair *) undefined) 
 	  ((pair (or fixnum char boolean eof null undefined)) (##sys#setislot #(1) '0 #(2)))
@@ -136,101 +139,101 @@
 	  ((pair (or fixnum char boolean eof null undefined)) (##sys#setislot #(1) '1 #(2)))
 	  ((pair *) (##sys#setslot #(1) '1 #(2))))
 
-(null? (#(procedure #:predicate null) null? (*) boolean))
-(list? (#(procedure #:predicate list) list? (*) boolean))
+(null? (#(procedure #:pure #:predicate null) null? (*) boolean))
+(list? (#(procedure #:pure #:predicate list) list? (*) boolean))
 
-(list (procedure list (#!rest) list)
+(list (#(procedure #:pure) list (#!rest) list)
       (() (null) '()))
 
-(##sys#list (procedure ##sys#list (#!rest) list)
+(##sys#list (#(procedure #:pure) ##sys#list (#!rest) list)
 	    (() (null) '()))
 
-(length (#(procedure #:enforce) length (list) fixnum)
+(length (#(procedure #:clean #:enforce) length (list) fixnum) ; may loop
 	((null) '0)
 	((list) (##core#inline "C_u_i_length" #(1))))
 
-(##sys#length (#(procedure #:enforce) ##sys#length (list) fixnum)
+(##sys#length (#(procedure #:clean #:enforce) ##sys#length (list) fixnum)
 	      ((null) '0)
 	      ((list) (##core#inline "C_u_i_length" #(1))))
 
-(list-tail (forall (a) (#(procedure #:enforce) list-tail ((list a) fixnum) (list a))))
-(list-ref (forall (a) (#(procedure #:enforce) list-ref ((list a) fixnum) a)))
-(append (procedure append (list #!rest) *))
-(##sys#append (procedure ##sys#append (list #!rest) *))
-(reverse (forall (a) (#(procedure #:enforce) reverse ((list a)) (list a))))
-(memq (procedure memq (* list) *) ((* list) (##core#inline "C_u_i_memq" #(1) #(2))))
+(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)))
+(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))))
+(memq (#(procedure #:clean) memq (* list) *) ((* list) (##core#inline "C_u_i_memq" #(1) #(2))))
 
-(memv (procedure memv (* list) *)
+(memv (#(procedure #:clean) memv (* list) *)
       (((or fixnum boolean char eof undefined null) list)
        (##core#inline "C_u_i_memq" #(1) #(2))))
 
 ;; this may be a bit much...
-(member (forall (a) (procedure member (* list #!optional (procedure (* *) *)) *))
+(member (forall (a) (#(procedure #:clean) member (* list #!optional (procedure (* *) *)) *))
 	(((or fixnum boolean char eof undefined null) list)
 	 (##core#inline "C_u_i_memq" #(1) #(2)))
 	((* (list (or fixnum boolean char eof undefined null)))
 	 (##core#inline "C_u_i_memq" #(1) #(2))))
 
-(assq (procedure assq (* list) *) ((* list) (##core#inline "C_u_i_assq" #(1) #(2))))
+(assq (#(procedure #:clean) assq (* list) *) ((* list) (##core#inline "C_u_i_assq" #(1) #(2))))
 
-(assv (procedure assv (* list) *)
+(assv (#(procedure #:clean) assv (* list) *)
       (((or fixnum boolean char eof undefined null) list)
        (##core#inline "C_u_i_assq" #(1) #(2)))
       ((* (list (or fixnum boolean char eof undefined null)))
        (##core#inline "C_u_i_assq" #(1) #(2))))
 
-(assoc (procedure assoc (* list #!optional (procedure (* *) *)) *)
+(assoc (#(procedure #:clean) assoc (* list #!optional (procedure (* *) *)) *)
        (((or fixnum boolean char eof undefined null) list)
 	(##core#inline "C_u_i_assq" #(1) #(2)))
        ((* (list (or fixnum boolean char eof undefined null)))
 	(##core#inline "C_u_i_assq" #(1) #(2))))
 
-(symbol? (#(procedure #:predicate symbol) symbol? (*) boolean))
+(symbol? (#(procedure #:pure #:predicate symbol) symbol? (*) boolean))
 
-(symbol-append (#(procedure #:enforce) symbol-append (#!rest symbol) symbol))
-(symbol->string (#(procedure #:enforce) symbol->string (symbol) string))
-(string->symbol (#(procedure #:enforce) string->symbol (string) symbol))
+(symbol-append (#(procedure #:clean #:enforce) symbol-append (#!rest symbol) symbol))
+(symbol->string (#(procedure #:clean #:enforce) symbol->string (symbol) string))
+(string->symbol (#(procedure #:clean #:enforce) string->symbol (string) symbol))
 
-(number? (#(procedure #:predicate number) number? (*) boolean))
+(number? (#(procedure #:pure #:predicate number) number? (*) boolean))
 
 ;;XXX predicate?
-(integer? (procedure integer? (*) boolean)
+(integer? (#(procedure #:pure) integer? (*) boolean)
 	  ((fixnum) (let ((#(tmp) #(1))) '#t))
 	  ((float) (##core#inline "C_u_i_fpintegerp" #(1))))
 
-(exact? (#(procedure #:predicate fixnum) exact? (*) boolean))
-(real? (#(procedure #:predicate number) real? (*) boolean))
-(complex? (#(procedure #:predicate number) complex? (*) boolean))
-(inexact? (#(procedure #:predicate float) inexact? (*) boolean))
+(exact? (#(procedure #:pure #:predicate fixnum) exact? (*) boolean))
+(real? (#(procedure #:pure #:predicate number) real? (*) boolean))
+(complex? (#(procedure #:pure #:predicate number) complex? (*) boolean))
+(inexact? (#(procedure #:pure #:predicate float) inexact? (*) boolean))
 
 ;;XXX predicate?
-(rational? (procedure rational? (*) boolean)
+(rational? (#(procedure #:pure) rational? (*) boolean)
 	   ((fixnum) (let ((#(tmp) #(1))) '#t)))
 
-(zero? (#(procedure #:enforce) zero? (number) boolean) 
+(zero? (#(procedure #:clean #:enforce) zero? (number) boolean) 
        ((fixnum) (eq? #(1) '0))
        ((number) (##core#inline "C_u_i_zerop" #(1))))
 
-(odd? (#(procedure #:enforce) odd? (number) boolean) ((fixnum) (fxodd? #(1))))
-(even? (#(procedure #:enforce) even? (number) boolean) ((fixnum) (fxeven? #(1))))
+(odd? (#(procedure #:clean #:enforce) odd? (number) boolean) ((fixnum) (fxodd? #(1))))
+(even? (#(procedure #:clean #:enforce) even? (number) boolean) ((fixnum) (fxeven? #(1))))
 
-(positive? (#(procedure #:enforce) positive? (number) boolean)
+(positive? (#(procedure #:clean #:enforce) positive? (number) boolean)
 	   ((fixnum) (##core#inline "C_fixnum_greaterp" #(1) '0))
 	   ((number) (##core#inline "C_u_i_positivep" #(1))))
 
-(negative? (#(procedure #:enforce) negative? (number) boolean)
+(negative? (#(procedure #:clean #:enforce) negative? (number) boolean)
 	   ((fixnum) (##core#inline "C_fixnum_lessp" #(1) '0))
 	   ((number) (##core#inline "C_u_i_negativep" #(1))))
 
-(max (#(procedure #:enforce) max (#!rest number) number)
+(max (#(procedure #:clean #:enforce) max (#!rest number) number)
      ((fixnum fixnum) (fxmax #(1) #(2)))
      ((float float) (##core#inline "C_i_flonum_max" #(1) #(2))))
 
-(min (#(procedure #:enforce) min (#!rest number) number)
+(min (#(procedure #:clean #:enforce) min (#!rest number) number)
      ((fixnum fixnum) (fxmin #(1) #(2)))
      ((float float) (##core#inline "C_i_flonum_min" #(1) #(2))))
 
-(+ (#(procedure #:enforce) + (#!rest number) number)
+(+ (#(procedure #:clean #:enforce) + (#!rest number) number)
    (() (fixnum) '0)
    ((fixnum) (fixnum) #(1))
    ((float) (float) #(1))
@@ -249,7 +252,7 @@
    ((float float) (float)
     (##core#inline_allocate ("C_a_i_flonum_plus" 4) #(1) #(2))))
 
-(- (#(procedure #:enforce) - (number #!rest number) number)
+(- (#(procedure #:clean #:enforce) - (number #!rest number) number)
    ((fixnum) (fixnum)
     (##core#inline "C_u_fixnum_negate" #(1)))
    ((float fixnum) (float)
@@ -267,7 +270,7 @@
    ((float) (float) 
     (##core#inline_allocate ("C_a_i_flonum_negate" 4) #(1))))
 
-(* (#(procedure #:enforce) * (#!rest number) number)
+(* (#(procedure #:clean #:enforce) * (#!rest number) number)
    (() (fixnum) '1)
    ((fixnum) (fixnum) #(1))
    ((float) (float) #(1))
@@ -285,7 +288,7 @@
    ((float float) (float)
     (##core#inline_allocate ("C_a_i_flonum_times" 4) #(1) #(2))))
 
-(/ (#(procedure #:enforce) / (number #!rest number) number)
+(/ (#(procedure #:clean #:enforce) / (number #!rest number) number)
    ((float fixnum) (float)
     (##core#inline_allocate 
      ("C_a_i_flonum_quotient_checked" 4) 
@@ -299,7 +302,7 @@
    ((float float) (float)
     (##core#inline_allocate ("C_a_i_flonum_quotient_checked" 4) #(1) #(2))))
 
-(= (#(procedure #:enforce) = (#!rest number) boolean)
+(= (#(procedure #:clean #:enforce) = (#!rest number) boolean)
    ((fixnum fixnum) (eq? #(1) #(2)))
    ((float fixnum) (##core#inline
 		    "C_flonum_equalp"
@@ -311,7 +314,7 @@
 		    #(2)))
    ((float float) (##core#inline "C_flonum_equalp" #(1) #(2))))
 
-(> (#(procedure #:enforce) > (#!rest number) boolean)
+(> (#(procedure #:clean #:enforce) > (#!rest number) boolean)
    ((fixnum fixnum) (fx> #(1) #(2)))
    ((float fixnum) (##core#inline
 		    "C_flonum_greaterp"
@@ -323,7 +326,7 @@
 		    #(2)))
    ((float float) (##core#inline "C_flonum_greaterp" #(1) #(2))))
 
-(< (#(procedure #:enforce) < (#!rest number) boolean)
+(< (#(procedure #:clean #:enforce) < (#!rest number) boolean)
    ((fixnum fixnum) (fx< #(1) #(2)))
    ((float fixnum) (##core#inline
 		    "C_flonum_lessp"
@@ -335,7 +338,7 @@
 		    #(2)))
    ((float float) (##core#inline "C_flonum_lessp" #(1) #(2))))
 
-(>= (#(procedure #:enforce) >= (#!rest number) boolean)
+(>= (#(procedure #:clean #:enforce) >= (#!rest number) boolean)
     ((fixnum fixnum) (fx>= #(1) #(2)))
     ((float fixnum) (##core#inline
 		     "C_flonum_greater_or_equal_p"
@@ -347,7 +350,7 @@
 		     #(2)))
     ((float float) (##core#inline "C_flonum_greater_or_equal_p" #(1) #(2))))
 
-(<= (#(procedure #:enforce) <= (#!rest number) boolean)
+(<= (#(procedure #:clean #:enforce) <= (#!rest number) boolean)
     ((fixnum fixnum) (fx<= #(1) #(2)))
     ((float fixnum) (##core#inline
 		     "C_flonum_less_or_equal_p"
@@ -359,180 +362,181 @@
 		     #(2)))
     ((float float) (##core#inline "C_flonum_less_or_equal_p" #(1) #(2))))
 
-(quotient (#(procedure #:enforce) quotient (number number) number)
+(quotient (#(procedure #:clean #:enforce) quotient (number number) number)
 	  ;;XXX flonum/mixed case
 	  ((fixnum fixnum) (fixnum)
 	   (##core#inline "C_fixnum_divide" #(1) #(2))))
 
-(remainder (#(procedure #:enforce) remainder (number number) number)
+(remainder (#(procedure #:clean #:enforce) remainder (number number) number)
 	   ;;XXX flonum/mixed case
 	   ((fixnum fixnum) (fixnum)
 	    (##core#inline "C_fixnum_modulo" #(1) #(2))))
 
-(modulo (#(procedure #:enforce) modulo (number number) number))
+(modulo (#(procedure #:clean #:enforce) modulo (number number) number))
 
-(gcd (#(procedure #:enforce) gcd (#!rest number) number) ((* *) (##sys#gcd #(1) #(2))))
-(lcm (#(procedure #:enforce) lcm (#!rest number) number) ((* *) (##sys#lcm #(1) #(2))))
+(gcd (#(procedure #:clean #:enforce) gcd (#!rest number) number) ((* *) (##sys#gcd #(1) #(2))))
+(lcm (#(procedure #:clean #:enforce) lcm (#!rest number) number) ((* *) (##sys#lcm #(1) #(2))))
 
-(abs (#(procedure #:enforce) abs (number) number)
+(abs (#(procedure #:clean #:enforce) abs (number) number)
      ((fixnum) (fixnum)
       (##core#inline "C_fixnum_abs" #(1)))
      ((float) (float)
       (##core#inline_allocate ("C_a_i_flonum_abs" 4) #(1))))
 
-(floor (#(procedure #:enforce) floor (number) number)
+(floor (#(procedure #:clean #:enforce) floor (number) number)
        ((fixnum) (fixnum) #(1))
        ((float) (float)
 	(##core#inline_allocate ("C_a_i_flonum_floor" 4) #(1))))
 
-(ceiling (#(procedure #:enforce) ceiling (number) number)
+(ceiling (#(procedure #:clean #:enforce) ceiling (number) number)
 	 ((fixnum) (fixnum) #(1))
 	 ((float) (float)
 	  (##core#inline_allocate ("C_a_i_flonum_ceiling" 4) #(1))))
 
-(truncate (#(procedure #:enforce) truncate (number) number)
+(truncate (#(procedure #:clean #:enforce) truncate (number) number)
 	  ((fixnum) (fixnum) #(1))
 	  ((float) (float)
 	   (##core#inline_allocate ("C_a_i_flonum_truncate" 4) #(1))))
 
-(round (#(procedure #:enforce) round (number) number)
+(round (#(procedure #:clean #:enforce) round (number) number)
        ((fixnum) (fixnum) #(1))
        ((float) (float)
 	(##core#inline_allocate ("C_a_i_flonum_round" 4) #(1))))
 
-(exact->inexact (#(procedure #:enforce) exact->inexact (number) float)
+(exact->inexact (#(procedure #:clean #:enforce) exact->inexact (number) float)
 		((float) #(1))
 		((fixnum) (##core#inline_allocate ("C_a_i_fix_to_flo" 4) #(1))))
 
-(inexact->exact (#(procedure #:enforce) inexact->exact (number) fixnum) ((fixnum) #(1)))
+(inexact->exact (#(procedure #:clean #:enforce) inexact->exact (number) fixnum) ((fixnum) #(1)))
 
-(exp (#(procedure #:enforce) exp (number) float)
+(exp (#(procedure #:clean #:enforce) exp (number) float)
      ((float) (##core#inline_allocate ("C_a_i_flonum_exp" 4) #(1))))
 
-(log (#(procedure #:enforce) log (number) float)
+(log (#(procedure #:clean #:enforce) log (number) float)
      ((float) (##core#inline_allocate ("C_a_i_flonum_log" 4) #(1))))
 
-(expt (#(procedure #:enforce) expt (number number) number)
+(expt (#(procedure #:clean #:enforce) expt (number number) number)
       ((float float) (float)
        (##core#inline_allocate ("C_a_i_flonum_expt" 4) #(1) #(2))))
 
-(sqrt (#(procedure #:enforce) sqrt (number) float)
+(sqrt (#(procedure #:clean #:enforce) sqrt (number) float)
       ((float) (##core#inline_allocate ("C_a_i_flonum_sqrt" 4) #(1))))
 
-(sin (#(procedure #:enforce) sin (number) float)
+(sin (#(procedure #:clean #:enforce) sin (number) float)
      ((float) (##core#inline_allocate ("C_a_i_flonum_sin" 4) #(1))))
 
-(cos (#(procedure #:enforce) cos (number) float)
+(cos (#(procedure #:clean #:enforce) cos (number) float)
      ((float) (##core#inline_allocate ("C_a_i_flonum_cos" 4) #(1))))
 
-(tan (#(procedure #:enforce) tan (number) float)
+(tan (#(procedure #:clean #:enforce) tan (number) float)
      ((float) (##core#inline_allocate ("C_a_i_flonum_tan" 4) #(1))))
 
-(asin (#(procedure #:enforce) asin (number) float) 
+(asin (#(procedure #:clean #:enforce) asin (number) float) 
       ((float) (##core#inline_allocate ("C_a_i_flonum_asin" 4) #(1))))
 
-(acos (#(procedure #:enforce) acos (number) float)
+(acos (#(procedure #:clean #:enforce) acos (number) float)
       ((float) (##core#inline_allocate ("C_a_i_flonum_acos" 4) #(1))))
 
-(atan (#(procedure #:enforce) atan (number #!optional number) float)
+(atan (#(procedure #:clean #:enforce) atan (number #!optional number) float)
       ((float) (##core#inline_allocate ("C_a_i_flonum_atan" 4) #(1)))
       ((float float) (##core#inline_allocate ("C_a_i_flonum_atan2" 4) #(1))))
 
-(number->string (#(procedure #:enforce) number->string (number #!optional number) string)
+(number->string (#(procedure #:clean #:enforce) number->string (number #!optional number) string)
 		((fixnum) (##sys#fixnum->string #(1))))
 
-(string->number (#(procedure #:enforce) string->number (string #!optional number) 
+(string->number (#(procedure #:clean #:enforce) string->number (string #!optional number) 
 		 (or number boolean)))
 
-(char? (#(procedure #:predicate char) char? (*) boolean))
+(char? (#(procedure #:pure #:predicate char) char? (*) boolean))
 
 ;; we could rewrite these, but this is done by the optimizer anyway (safe)
-(char=? (#(procedure #:enforce) char=? (char char) boolean))
-(char>? (#(procedure #:enforce) char>? (char char) boolean))
-(char<? (#(procedure #:enforce) char<? (char char) boolean))
-(char>=? (#(procedure #:enforce) char>=? (char char) boolean))
-(char<=? (#(procedure #:enforce) char<=? (char char) boolean))
-
-(char-ci=? (#(procedure #:enforce) char-ci=? (char char) boolean))
-(char-ci<? (#(procedure #:enforce) char-ci<? (char char) boolean))
-(char-ci>? (#(procedure #:enforce) char-ci>? (char char) boolean))
-(char-ci>=? (#(procedure #:enforce) char-ci>=? (char char) boolean))
-(char-ci<=? (#(procedure #:enforce) char-ci<=? (char char) boolean))
-(char-alphabetic? (#(procedure #:enforce) char-alphabetic? (char) boolean))
-(char-whitespace? (#(procedure #:enforce) char-whitespace? (char) boolean))
-(char-numeric? (#(procedure #:enforce) char-numeric? (char) boolean))
-(char-upper-case? (#(procedure #:enforce) char-upper-case? (char) boolean))
-(char-lower-case? (#(procedure #:enforce) char-lower-case? (char) boolean))
-(char-upcase (#(procedure #:enforce) char-upcase (char) char))
-(char-downcase (#(procedure #:enforce) char-downcase (char) char))
-
-(char->integer (#(procedure #:enforce) char->integer (char) fixnum))
-(integer->char (#(procedure #:enforce) integer->char (fixnum) char))
-
-(string? (#(procedure #:predicate string) string? (*) boolean))
-
-(string=? (#(procedure #:enforce) string=? (string string) boolean)
+(char=? (#(procedure #:clean #:enforce) char=? (char char) boolean))
+(char>? (#(procedure #:clean #:enforce) char>? (char char) boolean))
+(char<? (#(procedure #:clean #:enforce) char<? (char char) boolean))
+(char>=? (#(procedure #:clean #:enforce) char>=? (char char) boolean))
+(char<=? (#(procedure #:clean #:enforce) char<=? (char char) boolean))
+
+(char-ci=? (#(procedure #:clean #:enforce) char-ci=? (char char) boolean))
+(char-ci<? (#(procedure #:clean #:enforce) char-ci<? (char char) boolean))
+(char-ci>? (#(procedure #:clean #:enforce) char-ci>? (char char) boolean))
+(char-ci>=? (#(procedure #:clean #:enforce) char-ci>=? (char char) boolean))
+(char-ci<=? (#(procedure #:clean #:enforce) char-ci<=? (char char) boolean))
+(char-alphabetic? (#(procedure #:clean #:enforce) char-alphabetic? (char) boolean))
+(char-whitespace? (#(procedure #:clean #:enforce) char-whitespace? (char) boolean))
+(char-numeric? (#(procedure #:clean #:enforce) char-numeric? (char) boolean))
+(char-upper-case? (#(procedure #:clean #:enforce) char-upper-case? (char) boolean))
+(char-lower-case? (#(procedure #:clean #:enforce) char-lower-case? (char) boolean))
+(char-upcase (#(procedure #:clean #:enforce) char-upcase (char) char))
+(char-downcase (#(procedure #:clean #:enforce) char-downcase (char) char))
+
+(char->integer (#(procedure #:clean #:enforce) char->integer (char) fixnum))
+(integer->char (#(procedure #:clean #:enforce) integer->char (fixnum) char))
+
+(string? (#(procedure #:pure #:predicate string) string? (*) boolean))
+
+(string=? (#(procedure #:clean #:enforce) string=? (string string) boolean)
 	  ((string string) (##core#inline "C_u_i_string_equal_p" #(1) #(2))))
 
-(string>? (#(procedure #:enforce) string>? (string string) boolean))
-(string<? (#(procedure #:enforce) string<? (string string) boolean))
-(string>=? (#(procedure #:enforce) string>=? (string string) boolean))
-(string<=? (#(procedure #:enforce) string<=? (string string) boolean))
-(string-ci=? (#(procedure #:enforce) string-ci=? (string string) boolean))
-(string-ci<? (#(procedure #:enforce) string-ci<? (string string) boolean))
-(string-ci>? (#(procedure #:enforce) string-ci>? (string string) boolean))
-(string-ci>=? (#(procedure #:enforce) string-ci>=? (string string) boolean))
-(string-ci<=? (#(procedure #:enforce) string-ci<=? (string string) boolean))
-
-(make-string (#(procedure #:enforce) make-string (fixnum #!optional char) string)
+(string>? (#(procedure #:clean #:enforce) string>? (string string) boolean))
+(string<? (#(procedure #:clean #:enforce) string<? (string string) boolean))
+(string>=? (#(procedure #:clean #:enforce) string>=? (string string) boolean))
+(string<=? (#(procedure #:clean #:enforce) string<=? (string string) boolean))
+(string-ci=? (#(procedure #:clean #:enforce) string-ci=? (string string) boolean))
+(string-ci<? (#(procedure #:clean #:enforce) string-ci<? (string string) boolean))
+(string-ci>? (#(procedure #:clean #:enforce) string-ci>? (string string) boolean))
+(string-ci>=? (#(procedure #:clean #:enforce) string-ci>=? (string string) boolean))
+(string-ci<=? (#(procedure #:clean #:enforce) string-ci<=? (string string) boolean))
+
+(make-string (#(procedure #:clean #:enforce) make-string (fixnum #!optional char) string)
 	     ((fixnum char) (##sys#make-string #(1) #(2)))
 	     ((fixnum) (##sys#make-string #(1) '#\space)))
 
-(string-length (#(procedure #:enforce) string-length (string) fixnum)
+(string-length (#(procedure #:clean #:enforce) string-length (string) fixnum)
 	       ((string) (##sys#size #(1))))
 
-(string-ref (#(procedure #:enforce) string-ref (string fixnum) char)
+(string-ref (#(procedure #:clean #:enforce) string-ref (string fixnum) char)
 	    ((string fixnum) (##core#inline "C_subchar" #(1) #(2))))
 
 (string-set! (#(procedure #:enforce) string-set! (string fixnum char) undefined)
 	     ((string fixnum char) (##core#inline "C_setsubchar" #(1) #(2) #(3))))
 
-(string-append (#(procedure #:enforce) string-append (#!rest string) string)
+(string-append (#(procedure #:clean #:enforce) string-append (#!rest string) string)
 	       ((string string) (##sys#string-append #(1) #(2))))
 
-;(string-copy (#(procedure #:enforce) string-copy (string) string)) - we use the more general version from srfi-13
+;(string-copy (#(procedure #:clean #:enforce) string-copy (string) string)) - we use the more general version from srfi-13
 
-(string->list (#(procedure #:enforce) string->list (string) (list char)))
-(list->string (#(procedure #:enforce) list->string ((list char)) string))
-(substring (#(procedure #:enforce) substring (string fixnum #!optional fixnum) string))
-;(string-fill! (#(procedure #:enforce) string-fill! (string char) string)) - s.a.
-(string (#(procedure #:enforce) string (#!rest char) string))
+(string->list (#(procedure #:clean #:enforce) string->list (string) (list char)))
+(list->string (#(procedure #:clean #:enforce) list->string ((list 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 #:predicate vector) vector? (*) boolean))
+(vector? (#(procedure #:pure #:predicate vector) vector? (*) boolean))
 
 ;; not result type "(vector a)", since it may be mutated!
-(make-vector (forall (a) (#(procedure #:enforce) make-vector (fixnum #!optional a) vector)))
+(make-vector (forall (a) (#(procedure #:clean #:enforce) make-vector (fixnum #!optional a) vector)))
 
-(vector-ref (forall (a) (#(procedure #:enforce) vector-ref ((vector a) fixnum) a)))
-(##sys#vector-ref (forall (a) (#(procedure #:enforce) ##sys#vector-ref ((vector 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))
-(vector (procedure vector (#!rest) vector))
-(##sys#vector (procedure ##sys#vector (#!rest) vector))
+(vector (#(procedure #:clean #:clean) vector (#!rest) vector))
+(##sys#vector (#(procedure #:clean #:clean) ##sys#vector (#!rest) vector))
 
-(vector-length (#(procedure #:enforce) vector-length (vector) fixnum)
+(vector-length (#(procedure #:clean #:enforce) vector-length (vector) fixnum)
 	       ((vector) (##sys#size #(1))))
-(##sys#vector-length (#(procedure #:enforce) ##sys#vector-length (vector) fixnum)
+(##sys#vector-length (#(procedure #:clean #:enforce) ##sys#vector-length (vector) fixnum)
 		     ((vector) (##sys#size #(1))))
 
-(vector->list (forall (a) (#(procedure #:enforce) vector->list ((vector a)) (list a))))
-(##sys#vector->list (forall (a) (#(procedure #:enforce) ##sys#vector->list ((vector a)) (list a))))
-(list->vector (forall (a) (#(procedure #:enforce) list->vector ((list a)) (vector a))))
-(##sys#list->vector (forall (a) (#(procedure #:enforce) ##sys#list->vector ((list a)) (vector a))))
+(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-fill! (#(procedure #:enforce) vector-fill! (vector *) undefined))
 
-(procedure? (#(procedure #:predicate procedure) procedure? (*) boolean))
+(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))))
 
 (for-each
@@ -547,18 +551,18 @@
 (call-with-current-continuation
  (#(procedure #:enforce) call-with-current-continuation ((procedure (procedure) . *)) . *))
 
-(input-port? (procedure input-port? (*) boolean))
-(output-port? (procedure output-port? (*) boolean))
+(input-port? (#(procedure #:pure) input-port? (*) boolean))
+(output-port? (#(procedure #:pure) output-port? (*) boolean))
 
 (current-input-port
- (#(procedure #:enforce) current-input-port (#!optional port) port)
+ (#(procedure #:clean #:enforce) current-input-port (#!optional port) port)
  ((port) (let ((#(tmp1) #(1))) 
 	   (let ((#(tmp2) (set! ##sys#standard-input #(tmp1))))
 	     #(tmp1))))
  (() ##sys#standard-input))
 
 (current-output-port
- (#(procedure #:enforce) current-output-port (#!optional port) port)
+ (#(procedure #:clean #:enforce) current-output-port (#!optional port) port)
  ((port) (let ((#(tmp1) #(1)))
 	   (let ((#(tmp2) (set! ##sys#standard-output #(tmp1))))
 	     #(tmp1))))
@@ -570,14 +574,14 @@
 (call-with-output-file
     (procedure call-with-output-file (string (procedure (port) . *) #!rest) . *))
 
-(open-input-file (#(procedure #:enforce) open-input-file (string #!rest symbol) port))
-(open-output-file (#(procedure #:enforce) open-output-file (string #!rest symbol) port))
+(open-input-file (#(procedure #:clean #:enforce) open-input-file (string #!rest symbol) port))
+(open-output-file (#(procedure #:clean #:enforce) open-output-file (string #!rest symbol) port))
 (close-input-port (#(procedure #:enforce) close-input-port (port) undefined))
 (close-output-port (#(procedure #:enforce) close-output-port (port) undefined))
 (load (procedure load (string #!optional (procedure (*) . *)) undefined))
 (read (#(procedure #:enforce) read (#!optional port) *))
 
-(eof-object? (#(procedure #:predicate eof) eof-object? (*) boolean))
+(eof-object? (#(procedure #:pure #:predicate eof) eof-object? (*) boolean))
 
 ;;XXX if we had input/output port distinction, we could specialize these:
 (read-char (#(procedure #:enforce) read-char (#!optional port) *)) ;XXX result (or eof char) ?
@@ -597,8 +601,8 @@
 (dynamic-wind
     (#(procedure #:enforce) dynamic-wind ((procedure () . *) (procedure () . *) (procedure () . *)) . *))
 
-(values (procedure values (#!rest values) . *))
-(##sys#values (procedure ##sys#values (#!rest values) . *))
+(values (#(procedure #:clean) values (#!rest values) . *))
+(##sys#values (#(procedure #:clean) ##sys#values (#!rest values) . *))
 
 (call-with-values (#(procedure #:enforce) call-with-values ((procedure () . *) procedure) . *)
   (((procedure () *) *) (let ((#(tmp1) #(1)))
@@ -614,147 +618,148 @@
 (eval (procedure eval (* #!optional (struct environment)) *))
 (char-ready? (#(procedure #:enforce) char-ready? (#!optional port) boolean))
 
-(imag-part (#(procedure #:enforce) imag-part (number) number)
+(imag-part (#(procedure #:clean #:enforce) imag-part (number) number)
 	   (((or fixnum float number)) (let ((#(tmp) #(1))) '0)))
 
-(real-part (#(procedure #:enforce) real-part (number) number)
+(real-part (#(procedure #:clean #:enforce) real-part (number) number)
 	   (((or fixnum float number)) #(1)))
 
-(magnitude (#(procedure #:enforce) magnitude (number) number)
+(magnitude (#(procedure #:clean #:enforce) magnitude (number) number)
 	   ((fixnum) (fixnum)
 	    (##core#inline "C_fixnum_abs" #(1)))
 	   ((float) (float)
 	    (##core#inline_allocate ("C_a_i_flonum_abs" 4) #(1))))
 
-(numerator (#(procedure #:enforce) numerator (number) number)
+(numerator (#(procedure #:clean #:enforce) numerator (number) number)
 	   ((fixnum) (fixnum) #(1)))
 	   
-(denominator (#(procedure #:enforce) denominator (number) number)
+(denominator (#(procedure #:clean #:enforce) denominator (number) number)
 	     ((fixnum) (fixnum) (let ((#(tmp) #(1))) '1)))
 
 (scheme-report-environment 
- (#(procedure #:enforce) scheme-report-environment (#!optional fixnum) (struct environment)))
+ (#(procedure #:clean #:enforce) scheme-report-environment (#!optional fixnum) (struct environment)))
 
 (null-environment
- (#(procedure #:enforce) null-environment (#!optional fixnum) (struct environment)))
+ (#(procedure #:clean #:enforce) null-environment (#!optional fixnum) (struct environment)))
 
 (interaction-environment
- (procedure interaction-environment () (struct environment)))
+ (#(procedure #:clean) interaction-environment () (struct environment)))
 
-(port-closed? (#(procedure #:enforce) port-closed? (port) boolean)
+(port-closed? (#(procedure #:clean #:enforce) port-closed? (port) boolean)
 	      ((port) (##sys#slot #(1) '8)))
 
+
 ;; chicken
 
 (abort (procedure abort (*) noreturn))
 
-(add1 (#(procedure #:enforce) add1 (number) number)
+(add1 (#(procedure #:clean #:enforce) add1 (number) number)
       ((float) (float) 
        (##core#inline_allocate ("C_a_i_flonum_plus" 4) #(1) '1.0)))
 
-(argc+argv (procedure argc+argv () fixnum (list string) fixnum))
-(argv (procedure argv () (list string)))
-(arithmetic-shift (#(procedure #:enforce) arithmetic-shift (number number) number))
+(argc+argv (#(procedure #:clean) argc+argv () fixnum (list string) fixnum))
+(argv (#(procedure #:clean) argv () (list string)))
+(arithmetic-shift (#(procedure #:clean #:enforce) arithmetic-shift (number number) number))
 
-(bit-set? (#(procedure #:enforce) bit-set? (number fixnum) boolean)
+(bit-set? (#(procedure #:clean #:enforce) bit-set? (number fixnum) boolean)
 	  ((fixnum fixnum) (##core#inline "C_u_i_bit_setp" #(1) #(2))))
 
-(bitwise-and (#(procedure #:enforce) bitwise-and (#!rest number) number)
+(bitwise-and (#(procedure #:clean #:enforce) bitwise-and (#!rest number) number)
 	     ((fixnum fixnum) (fixnum)
 	      (##core#inline "C_fixnum_and" #(1) #(2))))
 
-(bitwise-ior (#(procedure #:enforce) bitwise-ior (#!rest number) number)
+(bitwise-ior (#(procedure #:clean #:enforce) bitwise-ior (#!rest number) number)
 	     ((fixnum fixnum) (fixnum)
 	      (##core#inline "C_fixnum_or" #(1) #(2))))
 
-(bitwise-not (#(procedure #:enforce) bitwise-not (number) number))
+(bitwise-not (#(procedure #:clean #:enforce) bitwise-not (number) number))
 
-(bitwise-xor (#(procedure #:enforce) bitwise-xor (#!rest number) number)
+(bitwise-xor (#(procedure #:clean #:enforce) bitwise-xor (#!rest number) number)
 	     ((fixnum fixnum) (fixnum) 
 	      (##core#inline "C_fixnum_xor" #(1) #(2))))
 
-(blob->string (#(procedure #:enforce) blob->string (blob) string))
+(blob->string (#(procedure #:clean #:enforce) blob->string (blob) string))
 
-(blob-size (#(procedure #:enforce) blob-size (blob) fixnum)
+(blob-size (#(procedure #:clean #:enforce) blob-size (blob) fixnum)
 	   ((blob) (##sys#size #(1))))
 
-(blob? (#(procedure #:predicate blob) blob? (*) boolean))
+(blob? (#(procedure #:pure #:predicate blob) blob? (*) boolean))
 
-(blob=? (#(procedure #:enforce) blob=? (blob blob) boolean))
-(build-platform (procedure build-platform () symbol))
+(blob=? (#(procedure #:clean #:enforce) blob=? (blob blob) boolean))
+(build-platform (#(procedure #:pure) build-platform () symbol))
 (call/cc (#(procedure #:enforce) call/cc ((procedure (*) . *)) . *))
-(case-sensitive (procedure case-sensitive (#!optional *) *))
-(char-name (#(procedure #:enforce) char-name ((or char symbol) #!optional char) *)) ;XXX -> (or char symbol) ?
-(chicken-home (procedure chicken-home () string))
-(chicken-version (procedure chicken-version (#!optional *) string))
-(command-line-arguments (procedure command-line-arguments (#!optional (list string)) (list string)))
-(condition-predicate (#(procedure #:enforce) condition-predicate (symbol) (procedure ((struct condition)) boolean)))
-(condition-property-accessor (#(procedure #:enforce) condition-property-accessor (symbol symbol #!optional *) (procedure ((struct condition)) *)))
+(case-sensitive (#(procedure #:clean) case-sensitive (#!optional *) *))
+(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)))
+(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 #:predicate (struct condition)) condition? (*) boolean))
+(condition? (#(procedure #:pure #:predicate (struct condition)) condition? (*) boolean))
 
-(condition->list (#(procedure #:enforce) condition->list ((struct condition)) (list (pair symbol *))))
+(condition->list (#(procedure #:clean #:enforce) condition->list ((struct condition)) (list (pair symbol *))))
 (continuation-capture (#(procedure #:enforce) continuation-capture ((procedure ((struct continuation)) . *)) *))
-(continuation-graft (#(procedure #:enforce) continuation-graft ((struct continuation) (procedure () . *)) *))
+(continuation-graft (#(procedure #:clean #:enforce) continuation-graft ((struct continuation) (procedure () . *)) *))
 (continuation-return (#(procedure #:enforce) continuation-return (procedure #!rest) . *)) ;XXX make return type more specific?
 
-(continuation? (#(procedure #:predicate (struct continuation)) continuation? (*) boolean))
+(continuation? (#(procedure #:pure #:predicate (struct continuation)) continuation? (*) boolean))
 
-(copy-read-table (#(procedure #:enforce) copy-read-table ((struct read-table)) (struct read-table)))
-(cpu-time (procedure cpu-time () fixnum fixnum))
+(copy-read-table (#(procedure #:clean #:enforce) copy-read-table ((struct read-table)) (struct read-table)))
+(cpu-time (#(procedure #:clean) cpu-time () fixnum fixnum))
 
 (current-error-port
- (#(procedure #:enforce) current-error-port (#!optional port) port)
+ (#(procedure #:clean #:enforce) current-error-port (#!optional port) port)
  ((port) (let ((#(tmp1) #(1))) 
 	   (let ((#(tmp2) (set! ##sys#standard-error #(tmp1))))
 	     #(tmp1))))
  (() ##sys#standard-error))
 
 (current-exception-handler
- (#(procedure #:enforce) current-exception-handler (#!optional (procedure (*) noreturn)) procedure)
+ (#(procedure #:clean #:enforce) current-exception-handler (#!optional (procedure (*) noreturn)) procedure)
  ((procedure) (let ((#(tmp1) #(1))) 
 		(let ((#(tmp2) (set! ##sys#current-exception-handler #(tmp1))))
 		  #(tmp1))))
  (() ##sys#current-exception-handler))
 
-(current-gc-milliseconds (procedure current-gc-milliseconds () fixnum))
-(current-milliseconds (procedure current-milliseconds () float))
+(current-gc-milliseconds (#(procedure #:clean) current-gc-milliseconds () fixnum))
+(current-milliseconds (#(procedure #:clean) current-milliseconds () float))
 
 (current-read-table
- (procedure current-read-table (#!optional (struct read-table)) (struct read-table)))
+ (#(procedure #:clean) current-read-table (#!optional (struct read-table)) (struct read-table)))
 
-(current-seconds (procedure current-seconds () float))
-(define-reader-ctor (#(procedure #:enforce) define-reader-ctor (symbol procedure) undefined))
-(delete-file (#(procedure #:enforce) delete-file (string) string))
-(enable-warnings (procedure enable-warnings (#!optional *) *))
+(current-seconds (#(procedure #:clean) current-seconds () float))
+(define-reader-ctor (#(procedure #:clean #:enforce) define-reader-ctor (symbol procedure) undefined))
+(delete-file (#(procedure #:clean #:enforce) delete-file (string) string))
+(enable-warnings (#(procedure #:clean) enable-warnings (#!optional *) *))
 
-(equal=? (procedure equal=? (* *) boolean)
+(equal=? (#(procedure #:clean) equal=? (* *) boolean)
 	 (((or fixnum symbol char eof null undefined) *) (eq? #(1) #(2)))
 	 ((* (or fixnum symbol char eof null undefined)) (eq? #(1) #(2)))
 	 (((or float number) (or float number)) (= #(1) #(2))))
 
 (er-macro-transformer
- (#(procedure #:enforce) 
+ (#(procedure #:clean #:enforce) 
   er-macro-transformer
   ((procedure (* (procedure (*) *) (procedure (* *) *)) *))
   (struct transformer)))
 
-(errno (procedure errno () fixnum))
+(errno (#(procedure #:clean) errno () fixnum))
 (error (procedure error (* #!rest) noreturn))
 (##sys#error (procedure ##sys#error (* #!rest) noreturn))
 (##sys#signal-hook (procedure ##sys#signal-hook (* #!rest) noreturn))
 (exit (procedure exit (#!optional fixnum) noreturn))
-(exit-handler (#(procedure #:enforce) exit-handler (#!optional (procedure (fixnum) . *)) procedure))
+(exit-handler (#(procedure #:clean #:enforce) exit-handler (#!optional (procedure (fixnum) . *)) procedure))
 (expand (procedure expand (* #!optional list) *))
-(extension-information (procedure extension-information (symbol) *))
-(feature? (procedure feature? (symbol) boolean))
-(features (procedure features () (list symbol)))
-(file-exists? (#(procedure #:enforce) file-exists? (string) *))
-(directory-exists? (#(procedure #:enforce) directory-exists? (string) *))
+(extension-information (#(procedure #:clean) extension-information (symbol) *))
+(feature? (#(procedure #:clean) feature? (symbol) boolean))
+(features (#(procedure #:clean) features () (list symbol)))
+(file-exists? (#(procedure #:clean #:enforce) file-exists? (string) *))
+(directory-exists? (#(procedure #:clean #:enforce) directory-exists? (string) *))
 (fixnum-bits fixnum)
 (fixnum-precision fixnum)
 
-(fixnum? (#(procedure #:predicate fixnum) fixnum? (*) boolean))
+(fixnum? (#(procedure #:pure #:predicate fixnum) fixnum? (*) boolean))
 
 (flonum-decimal-precision fixnum)
 (flonum-epsilon float)
@@ -763,10 +768,10 @@
 (flonum-minimum-decimal-exponent fixnum)
 (flonum-minimum-exponent fixnum)
 (flonum-precision fixnum)
-(flonum-print-precision (#(procedure #:enforce) (#!optional fixnum) fixnum))
+(flonum-print-precision (#(procedure #:clean #:enforce) (#!optional fixnum) fixnum))
 (flonum-radix fixnum)
 
-(flonum? (#(procedure #:predicate float) flonum? (*) boolean))
+(flonum? (#(procedure #:pure #:predicate float) flonum? (*) boolean))
 
 (flush-output (#(procedure #:enforce) flush-output (#!optional port) undefined))
 
@@ -775,235 +780,237 @@
 
 (force-finalizers (procedure force-finalizers () undefined))
 
-(fp- (#(procedure #:enforce) fp- (float float) float)
+(fp- (#(procedure #:clean #:enforce) fp- (float float) float)
      ((float float) (##core#inline_allocate ("C_a_i_flonum_difference" 4) #(1) #(2)) ))
 
-(fp* (#(procedure #:enforce) fp* (float float) float)
+(fp* (#(procedure #:clean #:enforce) fp* (float float) float)
      ((float float) (##core#inline_allocate ("C_a_i_flonum_times" 4) #(1) #(2)) ))
 
-(fp/ (#(procedure #:enforce) fp/ (float float) float)
+(fp/ (#(procedure #:clean #:enforce) fp/ (float float) float)
      ((float float) (##core#inline_allocate ("C_a_i_flonum_quotient" 4) #(1) #(2)) ))
 
-(fp+ (#(procedure #:enforce) fp+ (float float) float)
+(fp+ (#(procedure #:clean #:enforce) fp+ (float float) float)
      ((float float) (##core#inline_allocate ("C_a_i_flonum_plus" 4) #(1) #(2)) ))
 
-(fp< (#(procedure #:enforce) fp< (float float) boolean)
+(fp< (#(procedure #:clean #:enforce) fp< (float float) boolean)
      ((float float) (##core#inline "C_flonum_lessp" #(1) #(2)) ))
 
-(fp<= (#(procedure #:enforce) fp<= (float float) boolean)
+(fp<= (#(procedure #:clean #:enforce) fp<= (float float) boolean)
       ((float float) (##core#inline "C_flonum_less_or_equal_p" #(1) #(2)) ))
 
-(fp= (#(procedure #:enforce) fp= (float float) boolean)
+(fp= (#(procedure #:clean #:enforce) fp= (float float) boolean)
      ((float float) (##core#inline "C_flonum_equalp" #(1) #(2)) ))
 
-(fp> (#(procedure #:enforce) fp> (float float) boolean)
+(fp> (#(procedure #:clean #:enforce) fp> (float float) boolean)
      ((float float) (##core#inline "C_flonum_greaterp" #(1) #(2)) ))
 
-(fp>= (#(procedure #:enforce) fp>= (float float) boolean)
+(fp>= (#(procedure #:clean #:enforce) fp>= (float float) boolean)
       ((float float) (##core#inline "C_flonum_greater_or_equal_p" #(1) #(2)) ))
 
-(fpabs (#(procedure #:enforce) fpabs (float) float)
+(fpabs (#(procedure #:clean #:enforce) fpabs (float) float)
        ((float) (##core#inline_allocate ("C_a_i_flonum_abs" 4) #(1) )))
 
-(fpacos (#(procedure #:enforce) fpacos (float) float)
+(fpacos (#(procedure #:clean #:enforce) fpacos (float) float)
        ((float) (##core#inline_allocate ("C_a_i_flonum_acos" 4) #(1) )))
 
-(fpasin (#(procedure #:enforce) fpasin (float) float)
+(fpasin (#(procedure #:clean #:enforce) fpasin (float) float)
 	((float) (##core#inline_allocate ("C_a_i_flonum_asin" 4) #(1) )))
 
-(fpatan (#(procedure #:enforce) fpatan (float) float)
+(fpatan (#(procedure #:clean #:enforce) fpatan (float) float)
 	((float) (##core#inline_allocate ("C_a_i_flonum_atan" 4) #(1) )))
 
-(fpatan2 (#(procedure #:enforce) fpatan2 (float float) float)
+(fpatan2 (#(procedure #:clean #:enforce) fpatan2 (float float) float)
 	 ((float float) (##core#inline_allocate ("C_a_i_flonum_atan2" 4)
 						#(1) #(2))))
-(fpceiling (#(procedure #:enforce) fpceiling (float) float)
+(fpceiling (#(procedure #:clean #:enforce) fpceiling (float) float)
 	   ((float) (##core#inline_allocate ("C_a_i_flonum_ceiling" 4) #(1) )))
 
-(fpcos (#(procedure #:enforce) fpcos (float) float)
+(fpcos (#(procedure #:clean #:enforce) fpcos (float) float)
        ((float) (##core#inline_allocate ("C_a_i_flonum_cos" 4) #(1) )))
 
-(fpexp (#(procedure #:enforce) fpexp (float) float)
+(fpexp (#(procedure #:clean #:enforce) fpexp (float) float)
        ((float) (##core#inline_allocate ("C_a_i_flonum_exp" 4) #(1) )))
 
-(fpexpt (#(procedure #:enforce) fpexpt (float float) float)
+(fpexpt (#(procedure #:clean #:enforce) fpexpt (float float) float)
 	((float float) (##core#inline_allocate ("C_a_i_flonum_expt" 4)
 					       #(1) #(2))))
 
-(fpfloor (#(procedure #:enforce) fpfloor (float) float)
+(fpfloor (#(procedure #:clean #:enforce) fpfloor (float) float)
 	 ((float) (##core#inline_allocate ("C_a_i_flonum_floor" 4) #(1) )))
 
-(fpinteger? (#(procedure #:enforce) fpinteger? (float) boolean)
+(fpinteger? (#(procedure #:clean #:enforce) fpinteger? (float) boolean)
 	    ((float) (##core#inline "C_u_i_flonum_intergerp" #(1) )))
 
-(fplog (#(procedure #:enforce) fplog (float) float)
+(fplog (#(procedure #:clean #:enforce) fplog (float) float)
        ((float) (##core#inline_allocate ("C_a_i_flonum_log" 4) #(1) )))
 
-(fpmax (#(procedure #:enforce) fpmax (float float) float)
+(fpmax (#(procedure #:clean #:enforce) fpmax (float float) float)
        ((float float) (##core#inline "C_i_flonum_max" #(1) #(2))))
 
-(fpmin (#(procedure #:enforce) fpmin (float float) float)
+(fpmin (#(procedure #:clean #:enforce) fpmin (float float) float)
        ((float float) (##core#inline "C_i_flonum_min" #(1) #(2))))
 
-(fpneg (#(procedure #:enforce) fpneg (float) float)
+(fpneg (#(procedure #:clean #:enforce) fpneg (float) float)
        ((float) (##core#inline_allocate ("C_a_i_flonum_negate" 4) #(1) )))
 
-(fpround (#(procedure #:enforce) fpround (float) float)
+(fpround (#(procedure #:clean #:enforce) fpround (float) float)
 	 ((float) (##core#inline_allocate ("C_a_i_flonum_round" 4) #(1) )))
 
-(fpsin (#(procedure #:enforce) fpsin (float) float)
+(fpsin (#(procedure #:clean #:enforce) fpsin (float) float)
        ((float) (##core#inline_allocate ("C_a_i_flonum_sin" 4) #(1) )))
 
-(fpsqrt (#(procedure #:enforce) fpsqrt (float) float)
+(fpsqrt (#(procedure #:clean #:enforce) fpsqrt (float) float)
 	((float) (##core#inline_allocate ("C_a_i_flonum_sqrt" 4) #(1) )))
 
-(fptan (#(procedure #:enforce) fptan (float) float)
+(fptan (#(procedure #:clean #:enforce) fptan (float) float)
        ((float) (##core#inline_allocate ("C_a_i_flonum_tan" 4) #(1) )))
 
-(fptruncate (#(procedure #:enforce) fptruncate (float) float)
+(fptruncate (#(procedure #:clean #:enforce) fptruncate (float) float)
 	    ((float) (##core#inline_allocate ("C_a_i_flonum_truncate" 4) #(1) )))
 
-(fx- (procedure fx- (fixnum fixnum) fixnum))
-(fx* (procedure fx* (fixnum fixnum) fixnum))
-(fx/ (procedure fx/ (fixnum fixnum) fixnum))
-(fx+ (procedure fx+ (fixnum fixnum) fixnum))
-(fx< (procedure fx< (fixnum fixnum) boolean))
-(fx<= (procedure fx<= (fixnum fixnum) boolean))
-(fx= (procedure fx= (fixnum fixnum) boolean))
-(fx> (procedure fx> (fixnum fixnum) boolean))
-(fx>= (procedure fx>= (fixnum fixnum) boolean))
-(fxand (procedure fxand (fixnum fixnum) fixnum))
-(fxeven? (procedure fxeven? (fixnum) boolean))
-(fxior (procedure fxior (fixnum fixnum) fixnum))
-(fxmax (procedure fxmax (fixnum fixnum) fixnum))
-(fxmin (procedure fxmin (fixnum fixnum) fixnum))
-(fxmod (procedure fxmod (fixnum fixnum) fixnum))
-(fxneg (procedure fxneg (fixnum) fixnum))
-(fxnot (procedure fxnot (fixnum) fixnum))
-(fxodd? (procedure fxodd? (fixnum) boolean))
-(fxshl (procedure fxshl (fixnum fixnum) fixnum))
-(fxshr (procedure fxshr (fixnum fixnum) fixnum))
-(fxxor (procedure fxxor (fixnum fixnum) fixnum))
-(gc (procedure gc (#!optional *) fixnum))
-(gensym (procedure gensym (#!optional (or string symbol)) symbol))
-
-(get (#(procedure #:enforce) get (symbol symbol #!optional *) *)
+;;XXX should these be enforcing?
+(fx- (#(procedure #:clean) fx- (fixnum fixnum) fixnum))
+(fx* (#(procedure #:clean) fx* (fixnum fixnum) fixnum))
+(fx/ (#(procedure #:clean) fx/ (fixnum fixnum) fixnum))
+(fx+ (#(procedure #:clean) fx+ (fixnum fixnum) fixnum))
+(fx< (#(procedure #:clean) fx< (fixnum fixnum) boolean))
+(fx<= (#(procedure #:clean) fx<= (fixnum fixnum) boolean))
+(fx= (#(procedure #:clean) fx= (fixnum fixnum) boolean))
+(fx> (#(procedure #:clean) fx> (fixnum fixnum) boolean))
+(fx>= (#(procedure #:clean) fx>= (fixnum fixnum) boolean))
+(fxand (#(procedure #:clean) fxand (fixnum fixnum) fixnum))
+(fxeven? (#(procedure #:clean) fxeven? (fixnum) boolean))
+(fxior (#(procedure #:clean) fxior (fixnum fixnum) fixnum))
+(fxmax (#(procedure #:clean) fxmax (fixnum fixnum) fixnum))
+(fxmin (#(procedure #:clean) fxmin (fixnum fixnum) fixnum))
+(fxmod (#(procedure #:clean) fxmod (fixnum fixnum) fixnum))
+(fxneg (#(procedure #:clean) fxneg (fixnum) fixnum))
+(fxnot (#(procedure #:clean) fxnot (fixnum) fixnum))
+(fxodd? (#(procedure #:clean) fxodd? (fixnum) boolean))
+(fxshl (#(procedure #:clean) fxshl (fixnum fixnum) fixnum))
+(fxshr (#(procedure #:clean) fxshr (fixnum fixnum) fixnum))
+(fxxor (#(procedure #:clean) fxxor (fixnum fixnum) fixnum))
+(gc (#(procedure #:clean) gc (#!optional *) fixnum))
+(gensym (#(procedure #:clean) gensym (#!optional (or string symbol)) symbol))
+
+(get (#(procedure #:clean #:enforce) get (symbol symbol #!optional *) *)
      ((symbol symbol *) (##core#inline "C_i_getprop" #(1) #(2) #(3))))
 
-(get-call-chain (#(procedure #:enforce) get-call-chain (#!optional fixnum (struct thread)) (list vector)))
-(get-condition-property (#(procedure #:enforce) get-condition-property ((struct condition) symbol symbol #!optional *) *))
-(get-environment-variable (#(procedure #:enforce) get-environment-variable (string) *))
-(get-keyword (#(procedure #:enforce) get-keyword (symbol list #!optional *) *))
-(get-output-string (#(procedure #:enforce) get-output-string (port) string))
-(get-properties (#(procedure #:enforce) get-properties (symbol list) symbol * list))
+(get-call-chain (#(procedure #:clean #:enforce) get-call-chain (#!optional fixnum (struct thread)) (list 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 *) *))
+(get-output-string (#(procedure #:clean #:enforce) get-output-string (port) string))
+(get-properties (#(procedure #:clean #:enforce) get-properties (symbol list) symbol * list))
 
 (getter-with-setter
- (#(procedure #:enforce)
+ (#(procedure #:clean #:enforce)
   getter-with-setter
   ((procedure (#!rest) *) (procedure (* #!rest) . *) #!optional string)
   procedure))
 
 (implicit-exit-handler
- (#(procedure #:enforce) implicit-exit-handler (#!optional (procedure () . *)) procedure))
+ (#(procedure #:clean #:enforce) implicit-exit-handler (#!optional (procedure () . *)) procedure))
 
 (ir-macro-transformer
- (procedure
+ (#(procedure #:clean #:enforce)
   ir-macro-transformer
   ((procedure (* (procedure (*) *) (procedure (* *) *)) *))
   (struct transformer)))
 
-(keyword->string (#(procedure #:enforce) keyword->string (symbol) string))
-(keyword-style (procedure keyword-style (#!optional symbol) symbol))
-(keyword? (procedure keyword? (*) boolean))
+(keyword->string (#(procedure #:clean #:enforce) keyword->string (symbol) string))
+(keyword-style (#(procedure #:clean) keyword-style (#!optional symbol) symbol))
+(keyword? (#(procedure #:pure) keyword? (*) boolean))
 (load-library (#(procedure #:enforce) load-library (symbol #!optional string) undefined))
 (load-relative (#(procedure #:enforce) load-relative (string #!optional (procedure (*) . *)) undefined))
-(load-verbose (procedure load-verbose (#!optional *) *))
-(machine-byte-order (procedure machine-byte-order () symbol))
-(machine-type (procedure machine-type () symbol))
+(load-verbose (#(procedure #:clean) load-verbose (#!optional *) *))
+(machine-byte-order (#(procedure #:pure) machine-byte-order () symbol))
+(machine-type (#(procedure #:pure) machine-type () symbol))
 
-(make-blob (#(procedure #:enforce) make-blob (fixnum) blob)
+(make-blob (#(procedure #:clean #:enforce) make-blob (fixnum) blob)
 	   ((fixnum) (##sys#make-blob #(1))))
 
-(make-composite-condition (#(procedure #:enforce) make-composite-condition (#!rest (struct condition)) (struct condition)))
-(make-parameter (#(procedure #:enforce) make-parameter (* #!optional procedure) procedure))
-(make-property-condition (#(procedure #:enforce) make-property-condition (symbol #!rest *) (struct condition)))
+(make-composite-condition (#(procedure #:clean #:enforce) make-composite-condition (#!rest (struct condition)) (struct condition)))
+(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 memory-statistics () (vector fixnum)))
+(memory-statistics (#(procedure #:clean) memory-statistics () (vector fixnum)))
 (minimum-flonum float)
 (most-negative-fixnum fixnum)
 (most-positive-fixnum fixnum)
-(on-exit (#(procedure #:enforce) on-exit ((procedure () . *)) undefined))
-(open-input-string (#(procedure #:enforce) open-input-string (string #!rest) port))
-(open-output-string (procedure open-output-string (#!rest) port))
-(parentheses-synonyms (procedure parentheses-synonyms (#!optional *) *))
+(on-exit (#(procedure #:clean #:enforce) on-exit ((procedure () . *)) undefined))
+(open-input-string (#(procedure #:clean #:enforce) open-input-string (string #!rest) port))
+(open-output-string (#(procedure #:clean) open-output-string (#!rest) port))
+(parentheses-synonyms (#(procedure #:clean) parentheses-synonyms (#!optional *) *))
 
-(port-name (#(procedure #:enforce) port-name (#!optional port) *)
+(port-name (#(procedure #:clean #:enforce) port-name (#!optional port) *)
 	   ((port) (##sys#slot #(1) '3)))
 
-(port-position (#(procedure #:enforce) port-position (#!optional port) fixnum))
+(port-position (#(procedure #:clean #:enforce) port-position (#!optional port) fixnum))
 
-(port? (#(procedure #:predicate port) port? (*) boolean))
+(port? (#(procedure #:pure #:predicate port) port? (*) boolean))
 
 (print (procedure print (#!rest *) undefined))
-(print-call-chain (#(procedure #:enforce) print-call-chain (#!optional port fixnum * string) undefined))
-(print-error-message (#(procedure #:enforce) print-error-message (* #!optional port string) undefined))
+(print-call-chain (#(procedure #:clean #:enforce) print-call-chain (#!optional port fixnum * string) undefined))
+(print-error-message (#(procedure #:clean #:enforce) print-error-message (* #!optional port string) undefined))
 (print* (procedure print* (#!rest) undefined))
-(procedure-information (#(procedure #:enforce) procedure-information (procedure) *))
-(program-name (#(procedure #:enforce) program-name (#!optional string) string))
-(promise? (#(procedure #:predicate (struct promise)) promise? (*) boolean))
+(procedure-information (#(procedure #:clean #:enforce) procedure-information (procedure) *))
+(program-name (#(procedure #:clean #:enforce) program-name (#!optional string) string))
+(promise? (#(procedure #:pure #:predicate (struct promise)) promise? (*) boolean))
 
-(put! (#(procedure #:enforce) put! (symbol symbol *) undefined)
+(put! (#(procedure #:clean #:enforce) put! (symbol symbol *) undefined)
       ((symbol symbol *)
        (##core#inline_allocate ("C_a_i_putprop" 8) #(1) #(2) #(3))))
 
 (quit (procedure quit (#!optional *) noreturn))
-(register-feature! (#(procedure #:enforce) register-feature! (#!rest symbol) undefined))
-(remprop! (#(procedure #:enforce) remprop! (symbol symbol) undefined))
-(rename-file (#(procedure #:enforce) rename-file (string string) string))
+(register-feature! (#(procedure #:clean #:enforce) register-feature! (#!rest symbol) undefined))
+(remprop! (#(procedure #:clean #:enforce) remprop! (symbol symbol) undefined))
+(rename-file (#(procedure #:clean #:enforce) rename-file (string string) string))
 (repl (#(procedure #:enforce) repl (#!optional (procedure (*) . *)) undefined))
-(repl-prompt (#(procedure #:enforce) repl-prompt (#!optional (procedure () string)) procedure))
-(repository-path (procedure repository-path (#!optional *) *))
-(require (procedure require (#!rest (or string symbol)) undefined))
+(repl-prompt (#(procedure #:clean #:enforce) repl-prompt (#!optional (procedure () string)) procedure))
+(repository-path (#(procedure #:clean) repository-path (#!optional *) *))
+(require (#(procedure #:clean) require (#!rest (or string symbol)) undefined))
 (reset (procedure reset () noreturn))
-(reset-handler (#(procedure #:enforce) reset-handler (#!optional (procedure () . *)) procedure))
+(reset-handler (#(procedure #:clean #:enforce) reset-handler (#!optional (procedure () . *)) procedure))
 (return-to-host (procedure return-to-host () . *))
-(reverse-list->string (#(procedure #:enforce) reverse-list->string ((list char)) string))
-(set-finalizer! (#(procedure #:enforce) set-finalizer! (* (procedure (*) . *)) *))
-(set-gc-report! (procedure set-gc-report! (*) undefined))
+(reverse-list->string (#(procedure #:clean #:enforce) reverse-list->string ((list char)) string))
+(set-finalizer! (#(procedure #:clean #:enforce) set-finalizer! (* (procedure (*) . *)) *))
+(set-gc-report! (#(procedure #:clean) set-gc-report! (*) undefined))
 
 (set-parameterized-read-syntax!
- (#(procedure #:enforce) set-parameterized-read-syntax! (char (procedure (port fixnum) . *)) undefined))
+ (#(procedure #:clean #:enforce) set-parameterized-read-syntax! (char (procedure (port fixnum) . *)) undefined))
 
-(set-port-name! (#(procedure #:enforce) set-port-name! (port string) undefined)
+(set-port-name! (#(procedure #:clean #:enforce) set-port-name! (port string) undefined)
 		((port string) (##sys#setslot #(1) '3 #(2))))
 
-(set-read-syntax! (#(procedure #:enforce) set-read-syntax! (char (procedure (port) . *)) undefined))
-(set-sharp-read-syntax! (#(procedure #:enforce) set-sharp-read-syntax! (char (procedure (port) . *)) undefined))
-(setter (#(procedure #:enforce) setter (procedure) procedure))
+(set-read-syntax! (#(procedure #:clean #:enforce) set-read-syntax! (char (procedure (port) . *)) undefined))
+(set-sharp-read-syntax! (#(procedure #:clean #:enforce) set-sharp-read-syntax! (char (procedure (port) . *)) undefined))
+(setter (#(procedure #:clean #:enforce) setter (procedure) procedure))
 (signal (procedure signal (*) . *))
-(signum (#(procedure #:enforce) signum (number) number))
-(software-type (procedure software-type () symbol))
-(software-version (procedure software-version () symbol))
-(string->blob (#(procedure #:enforce) string->blob (string) blob))
-(string->keyword (#(procedure #:enforce) string->keyword (string) symbol))
-(string->uninterned-symbol (#(procedure #:enforce) string->uninterned-symbol (string) symbol))
-(strip-syntax (procedure strip-syntax (*) *))
-
-(sub1 (#(procedure #:enforce) sub1 (number) number)
+(signum (#(procedure #:clean #:enforce) signum (number) number))
+(software-type (#(procedure #:pure) software-type () symbol))
+(software-version (#(procedure #:pure) software-version () symbol))
+(string->blob (#(procedure #:clean #:enforce) string->blob (string) blob))
+(string->keyword (#(procedure #:clean #:enforce) string->keyword (string) symbol))
+(string->uninterned-symbol (#(procedure #:clean #:enforce) string->uninterned-symbol (string) symbol))
+(strip-syntax (#(procedure #:clean) strip-syntax (*) *))
+
+(sub1 (#(procedure #:clean #:enforce) sub1 (number) number)
       ((float) (float)
        (##core#inline_allocate ("C_a_i_flonum_difference" 4) #(1) '1.0)))
 
-(subvector (forall (a) (#(procedure #:enforce) subvector ((vector a) fixnum #!optional fixnum) (vector a))))
-(symbol-escape (procedure symbol-escape (#!optional *) *))
+(subvector (forall (a) (#(procedure #:clean #:enforce) subvector ((vector a) fixnum #!optional fixnum) (vector a))))
+(symbol-escape (#(procedure #:clean) symbol-escape (#!optional *) *))
 
-(symbol-plist (#(procedure #:enforce) symbol-plist (symbol) list)
+(symbol-plist (#(procedure #:clean #:enforce) symbol-plist (symbol) list)
 	      ((symbol) (##sys#slot #(1) '2)))
 
 (syntax-error (procedure syntax-error (* #!rest) noreturn))
-(system (#(procedure #:enforce) system (string) fixnum))
-(unregister-feature! (#(procedure #:enforce) unregister-feature! (#!rest symbol) undefined))
-(vector-resize (forall (a) (#(procedure #:enforce) vector-resize ((vector a) fixnum) (vector a))))
-(void (procedure void (#!rest) undefined))
+(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) (vector a))))
+(void (#(procedure #:pure) void (#!rest) undefined))
+(##sys#void (#(procedure #:pure) void (#!rest) undefined))
 (warning (procedure warning (* #!rest) undefined))
 
 (with-exception-handler
@@ -1012,56 +1019,56 @@
 
 ;; chicken (internal)
 
-(##sys#foreign-char-argument (#(procedure #:enforce) ##sys#foreign-char-argument (char) char)
+(##sys#foreign-char-argument (#(procedure #:clean #:enforce) ##sys#foreign-char-argument (char) char)
 			     ((char) #(1)))
-(##sys#foreign-fixnum-argument (#(procedure #:enforce) ##sys#foreign-fixnum-argument (fixnum) fixnum)
+(##sys#foreign-fixnum-argument (#(procedure #:clean #:enforce) ##sys#foreign-fixnum-argument (fixnum) fixnum)
 			       ((fixnum) #(1)))
-(##sys#foreign-flonum-argument (#(procedure #:enforce) ##sys#foreign-flonum-argument (number) number)
+(##sys#foreign-flonum-argument (#(procedure #:clean #:enforce) ##sys#foreign-flonum-argument (number) number)
 			       ((float) #(1)))
-(##sys#foreign-string-argument (#(procedure #:enforce) ##sys#foreign-string-argument (string) string)
+(##sys#foreign-string-argument (#(procedure #:clean #:enforce) ##sys#foreign-string-argument (string) string)
 			       ((string) #(1)))
-(##sys#foreign-symbol-argument (#(procedure #:enforce) ##sys#foreign-symbol-argument (symbol) symbol)
+(##sys#foreign-symbol-argument (#(procedure #:clean #:enforce) ##sys#foreign-symbol-argument (symbol) symbol)
 			       ((symbol) #(1)))
-(##sys#foreign-pointer-argument (#(procedure #:enforce) ##sys#foreign-pointer-argument (pointer) pointer)
+(##sys#foreign-pointer-argument (#(procedure #:clean #:enforce) ##sys#foreign-pointer-argument (pointer) pointer)
 				((pointer) #(1)))
 
-(##sys#check-blob (#(procedure #:enforce) ##sys#check-blob (blob #!optional *) *)
+(##sys#check-blob (#(procedure #:clean #:enforce) ##sys#check-blob (blob #!optional *) *)
 		  ((blob) (let ((#(tmp) #(1))) '#t))
 		  ((blob *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-pair (#(procedure #:enforce) ##sys#check-pair (pair #!optional *) *)
+(##sys#check-pair (#(procedure #:clean #:enforce) ##sys#check-pair (pair #!optional *) *)
 		  ((pair) (let ((#(tmp) #(1))) '#t))
 		  ((pair *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-list (#(procedure #:enforce) ##sys#check-list (list #!optional *) *)
+(##sys#check-list (#(procedure #:clean #:enforce) ##sys#check-list (list #!optional *) *)
 		  (((or null pair list)) (let ((#(tmp) #(1))) '#t))
 		  (((or null pair list) *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-string (#(procedure #:enforce) ##sys#check-string (string #!optional *) *)
+(##sys#check-string (#(procedure #:clean #:enforce) ##sys#check-string (string #!optional *) *)
 		    ((string) (let ((#(tmp) #(1))) '#t))
 		    ((string) * (let ((#(tmp) #(1))) '#t)))
-(##sys#check-number (#(procedure #:enforce) ##sys#check-number (number #!optional *) *)
+(##sys#check-number (#(procedure #:clean #:enforce) ##sys#check-number (number #!optional *) *)
 		    ((number) (let ((#(tmp) #(1))) '#t))
 		    ((number *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-exact (#(procedure #:enforce) ##sys#check-exact (fixnum #!optional *) *)
+(##sys#check-exact (#(procedure #:clean #:enforce) ##sys#check-exact (fixnum #!optional *) *)
 		   ((fixnum) (let ((#(tmp) #(1))) '#t))
 		   ((fixnum *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-inexact (#(procedure #:enforce) ##sys#check-inexact (float #!optional *) *)
+(##sys#check-inexact (#(procedure #:clean #:enforce) ##sys#check-inexact (float #!optional *) *)
 		     ((float) (let ((#(tmp) #(1))) '#t))
 		     ((float *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-symbol (#(procedure #:enforce) ##sys#check-symbol (symbol #!optional *) *)
+(##sys#check-symbol (#(procedure #:clean #:enforce) ##sys#check-symbol (symbol #!optional *) *)
 		    ((symbol) (let ((#(tmp) #(1))) '#t))
 		    ((symbol *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-vector (#(procedure #:enforce) ##sys#check-vector (vector #!optional *) *)
+(##sys#check-vector (#(procedure #:clean #:enforce) ##sys#check-vector (vector #!optional *) *)
 		    ((vector) (let ((#(tmp) #(1))) '#t))
 		    ((vector *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-char (#(procedure #:enforce) ##sys#check-char (char #!optional *) *)
+(##sys#check-char (#(procedure #:clean #:enforce) ##sys#check-char (char #!optional *) *)
 		  ((char) (let ((#(tmp) #(1))) '#t))
 		  ((char *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-boolean (#(procedure #:enforce) ##sys#check-boolean (boolean #!optional *) *)
+(##sys#check-boolean (#(procedure #:clean #:enforce) ##sys#check-boolean (boolean #!optional *) *)
 		     ((boolean) (let ((#(tmp) #(1))) '#t))
 		     ((boolean *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-locative (#(procedure #:enforce) ##sys#check-locative (locative #!optional *) *)
+(##sys#check-locative (#(procedure #:clean #:enforce) ##sys#check-locative (locative #!optional *) *)
 		      ((locative) (let ((#(tmp) #(1))) '#t))
 		      ((locative *) (let ((#(tmp) #(1))) '#t)))
-(##sys#check-closure (#(procedure #:enforce) ##sys#check-closure (procedure #!optional *) *)
+(##sys#check-closure (#(procedure #:clean #:enforce) ##sys#check-closure (procedure #!optional *) *)
 		     ((procedure) (let ((#(tmp) #(1))) '#t))
 		     ((procedure *) (let ((#(tmp) #(1))) '#t)))
 (##sys#setslot (#(procedure #:enforce) ##sys#setslot (* fixnum *) *)
@@ -1073,85 +1080,85 @@
 (->string (procedure ->string (*) string)
 	  ((string) #(1)))
 
-(alist-ref (#(procedure #:enforce) alist-ref (* (list pair) #!optional (procedure (* *) *) *) *))
+(alist-ref (#(procedure #:clean #:enforce) alist-ref (* (list pair) #!optional (procedure (* *) *) *) *))
 (alist-update! (#(procedure #:enforce) alist-update! (* * (list pair) #!optional (procedure (* *) *)) *))
 (always? deprecated)
 
-(any? (procedure any? (*) boolean)
+(any? (#(procedure #:pure) any? (*) boolean)
       ((*) (let ((#(tmp) #(1))) '#t)))
 
-(atom? (procedure atom? (*) boolean)
+(atom? (#(procedure #:pure) atom? (*) boolean)
        ((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 #:enforce) butlast ((pair a *)) (list a))))
-(chop (forall (a) (#(procedure #:enforce) chop ((list a) fixnum) (list a))))
-(complement (#(procedure #:enforce) complement ((procedure (#!rest) *)) (procedure (#!rest) boolean)))
-(compose (#(procedure #:enforce) compose (#!rest procedure) procedure))
-(compress (forall (a) (#(procedure #:enforce) compress (list (list a)) (list a))))
+(butlast (forall (a) (#(procedure #:clean #:enforce) butlast ((pair a *)) (list a))))
+(chop (forall (a) (#(procedure #:clean #:enforce) chop ((list a) fixnum) (list 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))))
 (conc (procedure conc (#!rest) string))
-(conjoin (#(procedure #:enforce) conjoin (#!rest (procedure (*) *)) (procedure (*) *)))
-(constantly (forall (a) (procedure constantly (a) (procedure (#!rest) a))))
-(disjoin (#(procedure #:enforce) disjoin (#!rest (procedure (*) *)) (procedure (*) *)))
-(each (#(procedure #:enforce) each (#!rest procedure) procedure))
-(flatten (#(procedure #:enforce) flatten (pair) list))
-(flip (#(procedure #:enforce) flip ((procedure (* *) . *)) (procedure (* *) . *)))
-(identity (forall (a) (procedure identity (a) a)))
-(intersperse (#(procedure #:enforce) intersperse (list *) list))
-(join (#(procedure #:enforce) join (list list) list))
-(list->queue (#(procedure #:enforce) list->queue (list) (struct queue)))
-(list-of? (#(procedure #:enforce) list-of? ((procedure (*) *)) (procedure (list) boolean)))
-(make-queue (procedure make-queue () (struct queue)))
+(conjoin (#(procedure #:clean #:enforce) conjoin (#!rest (procedure (*) *)) (procedure (*) *)))
+(constantly (forall (a) (#(procedure #:pure) constantly (a) (procedure (#!rest) a))))
+(disjoin (#(procedure #:clean #:enforce) disjoin (#!rest (procedure (*) *)) (procedure (*) *)))
+(each (#(procedure #:clean #:enforce) each (#!rest procedure) procedure))
+(flatten (#(procedure #:clean #:enforce) flatten (pair) list))
+(flip (#(procedure #:clean #:enforce) flip ((procedure (* *) . *)) (procedure (* *) . *)))
+(identity (forall (a) (#(procedure #:pure) identity (a) a)))
+(intersperse (#(procedure #:clean #:enforce) intersperse (list *) list))
+(join (#(procedure #:clean #:enforce) join (list list) list))
+(list->queue (#(procedure #:clean #:enforce) list->queue (list) (struct queue)))
+(list-of? (#(procedure #:clean #:enforce) list-of? ((procedure (*) *)) (procedure (list) boolean)))
+(make-queue (#(procedure #:pure) make-queue () (struct queue)))
 (merge (#(procedure #:enforce) merge (list list (procedure (* *) *)) list))
 (merge! (#(procedure #:enforce) merge! (list list (procedure (* *) *)) list))
 (never? deprecated)
 (none? deprecated)
-(o (#(procedure #:enforce) o (#!rest (procedure (*) *)) (procedure (*) *)))
-(queue->list (#(procedure #:enforce) queue->list ((struct queue)) list))
-(queue-add! (#(procedure #:enforce) queue-add! ((struct queue) *) undefined))
+(o (#(procedure #:clean #:enforce) o (#!rest (procedure (*) *)) (procedure (*) *)))
+(queue->list (#(procedure #:clean #:enforce) queue->list ((struct queue)) list))
+(queue-add! (#(procedure #:clean #:enforce) queue-add! ((struct queue) *) undefined))
 
-(queue-empty? (#(procedure #:enforce) queue-empty? ((struct queue)) boolean)
+(queue-empty? (#(procedure #:clean #:enforce) queue-empty? ((struct queue)) boolean)
 	      (((struct queue)) (##core#inline "C_i_nullp" (##sys#slot #(1) '1))))
 
-(queue-first (#(procedure #:enforce) queue-first ((struct queue)) *))
-(queue-last (#(procedure #:enforce) queue-last ((struct queue)) *))
+(queue-first (#(procedure #:clean #:enforce) queue-first ((struct queue)) *))
+(queue-last (#(procedure #:clean #:enforce) queue-last ((struct queue)) *))
 
-(queue-length (#(procedure #:enforce) queue-length ((struct queue)) fixnum)
+(queue-length (#(procedure #:clean #:enforce) queue-length ((struct queue)) fixnum)
 	      (((struct queue)) (##sys#slot #(1) '3)))
 
-(queue-push-back! (#(procedure #:enforce) queue-push-back! ((struct queue) *) undefined))
-(queue-push-back-list! (#(procedure #:enforce) queue-push-back-list! ((struct queue) list) undefined))
-(queue-remove! (#(procedure #:enforce) queue-remove! ((struct queue)) *))
-(queue? (#(procedure #:predicate (struct queue)) queue? (*) boolean))
+(queue-push-back! (#(procedure #:clean #:enforce) queue-push-back! ((struct queue) *) undefined))
+(queue-push-back-list! (#(procedure #:clean #:enforce) queue-push-back-list! ((struct queue) list) undefined))
+(queue-remove! (#(procedure #:clean #:enforce) queue-remove! ((struct queue)) *))
+(queue? (#(procedure #:pure #:predicate (struct queue)) queue? (*) boolean))
 
-(rassoc (#(procedure #:enforce) rassoc (* (list pair) #!optional (procedure (* *) *)) *))
-(reverse-string-append (#(procedure #:enforce) reverse-string-append ((list string)) string))
+(rassoc (#(procedure #:clean #:enforce) rassoc (* (list pair) #!optional (procedure (* *) *)) *))
+(reverse-string-append (#(procedure #:clean #:enforce) reverse-string-append ((list string)) string))
 (shuffle deprecated)
 (sort (#(procedure #:enforce) sort ((or list vector) (procedure (* *) *)) (or list vector)))
 (sort! (#(procedure #:enforce) sort! ((or list vector) (procedure (* *) *)) (or list vector)))
 (sorted? (#(procedure #:enforce) sorted? ((or list vector) (procedure (* *) *)) boolean))
 (topological-sort (#(procedure #:enforce) topological-sort ((list list) (procedure (* *) *)) list))
-(string-chomp (#(procedure #:enforce) string-chomp (string #!optional string) string))
-(string-chop (#(procedure #:enforce) string-chop (string fixnum) (list string)))
-(string-compare3 (#(procedure #:enforce) string-compare3 (string string) fixnum))
-(string-compare3-ci (#(procedure #:enforce) string-compare3-ci (string string) fixnum))
-(string-intersperse (#(procedure #:enforce) string-intersperse ((list string) #!optional string) string))
-(string-split (#(procedure #:enforce) string-split (string #!optional string *) (list string)))
-(string-translate (#(procedure #:enforce) string-translate (string * #!optional *) string))
-(string-translate* (#(procedure #:enforce) string-translate* (string (list (pair string string))) string))
-(substring-ci=? (#(procedure #:enforce) substring-ci=? (string string #!optional fixnum fixnum fixnum) boolean))
-
-(substring-index (#(procedure #:enforce) substring-index (string string #!optional fixnum) *)
+(string-chomp (#(procedure #:clean #:enforce) string-chomp (string #!optional string) string))
+(string-chop (#(procedure #:clean #:enforce) string-chop (string fixnum) (list 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-translate (#(procedure #:clean #:enforce) string-translate (string * #!optional *) string))
+(string-translate* (#(procedure #:clean #:enforce) string-translate* (string (list (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) *)
 		 ((* *) (##sys#substring-index #(1) #(2) '0))
 		 ((* * *) (##sys#substring-index #(1) #(2) #(3))))
 
-(substring-index-ci (#(procedure #:enforce) substring-index-ci (string string #!optional fixnum) *)
+(substring-index-ci (#(procedure #:clean #:enforce) substring-index-ci (string string #!optional fixnum) *)
 		    ((* *) (##sys#substring-index-ci #(1) #(2) '0))
 		    ((* * *) (##sys#substring-index-ci #(1) #(2) #(3))))
 
-(substring=? (#(procedure #:enforce) substring=? (string string #!optional fixnum fixnum fixnum) boolean))
-(tail? (procedure tail? (* *) boolean))
+(substring=? (#(procedure #:clean #:enforce) substring=? (string string #!optional fixnum fixnum fixnum) boolean))
+(tail? (#(procedure #:clean) tail? (* *) boolean))
 
 
 ;; extras
@@ -1160,10 +1167,10 @@
 (fprintf (#(procedure #:enforce) fprintf (port string #!rest) undefined))
 (pp (#(procedure #:enforce) pp (* #!optional port) undefined))
 (pretty-print (#(procedure #:enforce) pretty-print (* #!optional port) undefined))
-(pretty-print-width (procedure pretty-print-width (#!optional fixnum) *))
+(pretty-print-width (#(procedure #:clean) pretty-print-width (#!optional fixnum) *))
 (printf (#(procedure #:enforce) printf (string #!rest) undefined))
-(random (#(procedure #:enforce) random (fixnum) fixnum))
-(randomize (#(procedure #:enforce) randomize (#!optional fixnum) undefined))
+(random (#(procedure #:clean #:enforce) random (fixnum) fixnum))
+(randomize (#(procedure #:clean #:enforce) randomize (#!optional fixnum) undefined))
 (read-buffered (#(procedure #:enforce) read-buffered (#!optional port) string))
 (read-byte (#(procedure #:enforce) read-byte (#!optional port) *))
 (read-file (#(procedure #:enforce) read-file (#!optional (or port string) (procedure (port) *) fixnum) list))
@@ -1184,61 +1191,63 @@
 
 ;; files
 
-(delete-file* (#(procedure #:enforce) delete-file* (string) *))
-(file-copy (#(procedure #:enforce) file-copy (string string #!optional * fixnum) fixnum))
-(file-move (#(procedure #:enforce) file-move (string string #!optional * fixnum) fixnum))
-(make-pathname (#(procedure #:enforce) make-pathname (* #!optional string string) string))
-(directory-null? (#(procedure #:enforce) directory-null? (string) boolean))
-(make-absolute-pathname (#(procedure #:enforce) make-absolute-pathname (* #!optional string string) string))
-(create-temporary-directory (#(procedure #:enforce) create-temporary-directory () string))
-(create-temporary-file (#(procedure #:enforce) create-temporary-file (#!optional string) string))
-(decompose-directory (#(procedure #:enforce) decompose-directory (string) * * *))
-(decompose-pathname (#(procedure #:enforce) decompose-pathname (string) * * *))
-(absolute-pathname? (#(procedure #:enforce) absolute-pathname? (string) boolean))
-(pathname-directory (#(procedure #:enforce) pathname-directory (string) *))
-(pathname-extension (#(procedure #:enforce) pathname-extension (string) *))
-(pathname-file (#(procedure #:enforce) pathname-file (string) *))
-(pathname-replace-directory (#(procedure #:enforce) pathname-replace-directory (string string) string))
-(pathname-replace-extension (#(procedure #:enforce) pathname-replace-extension (string string) string))
-(pathname-replace-file (#(procedure #:enforce) pathname-replace-file (string string) string))
-(pathname-strip-directory (#(procedure #:enforce) pathname-strip-directory (string) string))
-(pathname-strip-extension (#(procedure #:enforce) pathname-strip-extension (string) string))
-(normalize-pathname (#(procedure #:enforce) normalize-pathname (string #!optional symbol) string))
+(delete-file* (#(procedure #:clean #:enforce) delete-file* (string) *))
+(file-copy (#(procedure #:clean #:enforce) file-copy (string string #!optional * fixnum) fixnum))
+(file-move (#(procedure #:clean #:enforce) file-move (string string #!optional * fixnum) fixnum))
+(make-pathname (#(procedure #:clean #:enforce) make-pathname (* #!optional string string) string))
+(directory-null? (#(procedure #:clean #:enforce) directory-null? (string) boolean))
+(make-absolute-pathname (#(procedure #:clean #:enforce) make-absolute-pathname (* #!optional string string) string))
+(create-temporary-directory (#(procedure #:clean #:enforce) create-temporary-directory () string))
+(create-temporary-file (#(procedure #:clean #:enforce) create-temporary-file (#!optional string) string))
+(decompose-directory (#(procedure #:clean #:enforce) decompose-directory (string) * * *))
+(decompose-pathname (#(procedure #:clean #:enforce) decompose-pathname (string) * * *))
+(absolute-pathname? (#(procedure #:clean #:enforce) absolute-pathname? (string) boolean))
+(pathname-directory (#(procedure #:clean #:enforce) pathname-directory (string) *))
+(pathname-extension (#(procedure #:clean #:enforce) pathname-extension (string) *))
+(pathname-file (#(procedure #:clean #:enforce) pathname-file (string) *))
+(pathname-replace-directory (#(procedure #:clean #:enforce) pathname-replace-directory (string string) string))
+(pathname-replace-extension (#(procedure #:clean #:enforce) pathname-replace-extension (string string) string))
+(pathname-replace-file (#(procedure #:clean #:enforce) pathname-replace-file (string string) string))
+(pathname-strip-directory (#(procedure #:clean #:enforce) pathname-strip-directory (string) string))
+(pathname-strip-extension (#(procedure #:clean #:enforce) pathname-strip-extension (string) string))
+(normalize-pathname (#(procedure #:clean #:enforce) normalize-pathname (string #!optional symbol) string))
 
 
 ;; irregex
 
 ;;XXX these need to be reviewed by Alex and/or sjamaan
 
-(irregex (procedure irregex (#!rest) *))
+;;XXX which do not invoke stored procedures that may modify local state? (clean)
+
+(irregex (#(procedure #:clean) irregex (#!rest) *))
 ;irregex-apply-match
 
-(irregex-dfa (#(procedure #:enforce) irregex-dfa ((struct regexp)) *)
+(irregex-dfa (#(procedure #:clean #:enforce) irregex-dfa ((struct regexp)) *)
 	     (((struct regexp)) (##sys#slot #(1) '1)))
 
-(irregex-dfa/extract (#(procedure #:enforce) irregex-dfa/extract ((struct regexp)) *)
+(irregex-dfa/extract (#(procedure #:clean #:enforce) irregex-dfa/extract ((struct regexp)) *)
 		     (((struct regexp)) (##sys#slot #(1) '3)))
 
-(irregex-dfa/search (#(procedure #:enforce) irregex-dfa/search ((struct regexp)) *)
+(irregex-dfa/search (#(procedure #:clean #:enforce) irregex-dfa/search ((struct regexp)) *)
 		    (((struct regexp)) (##sys#slot #(1) '2)))
 
-(irregex-extract (#(procedure #:enforce) irregex-extract (* string #!optional fixnum fixnum) list))
-(irregex-flags (#(procedure #:enforce) irregex-flags ((struct regexp)) *)
+(irregex-extract (#(procedure #:enforce) irregex-extract (* string #!optional fixnum fixnum) list)) ;XXX specialize?
+(irregex-flags (#(procedure #:clean #:enforce) irregex-flags ((struct regexp)) *)
 	       (((struct regexp)) (##sys#slot #(1) '5)))
 
 (irregex-fold (#(procedure #:enforce) irregex-fold (* (procedure (fixnum (struct regexp-match) *) *) * string #!optional (procedure (fixnum *) *) fixnum fixnum) *))
 
 (irregex-fold/chunked (#(procedure #:enforce) irregex-fold/chunked (* (procedure (* fixnum (struct regexp-match) *) *) * procedure * #!optional (procedure (* fixnum *) *) fixnum fixnum) *))
 
-(irregex-lengths (#(procedure #:enforce) irregex-lengths ((struct regexp)) *)
+(irregex-lengths (#(procedure #:clean #:enforce) irregex-lengths ((struct regexp)) *)
 		 (((struct regexp)) (##sys#slot #(1) '7)))
 
 (irregex-match (#(procedure #:enforce) irregex-match (* string) *))
 ;irregex-match?
 
-(irregex-match-data? (#(procedure #:predicate (struct regexp-match)) irregex-match-data? (*) boolean))
+(irregex-match-data? (#(procedure #:pure #:predicate (struct regexp-match)) irregex-match-data? (*) boolean))
 
-(irregex-match-end (procedure irregex-match-end (* #!optional *) *))
+(irregex-match-end (#(procedure) irregex-match-end (* #!optional *) *))
 ;irregex-match-end-chunk
 (irregex-match-end-index (#(procedure #:enforce) irregex-match-end-index ((struct regexp-match) #!optional *) fixnum))
 
@@ -1246,23 +1255,23 @@
 		     (((struct regexp-match)) (##sys#slot #(1) '2)))
 
 (irregex-match-num-submatches (#(procedure #:enforce) irregex-match-num-submatches ((struct regexp-match)) fixnum))
-(irregex-match-start (procedure irregex-match-start (* #!optional *) *))
+(irregex-match-start (#(procedure) irregex-match-start (* #!optional *) *))
 ;irregex-match-start-chunk
 (irregex-match-start-index (#(procedure #:enforce) irregex-match-start-index ((struct regexp-match) #!optional *) fixnum))
-(irregex-match-string (procedure irregex-match-string (*) *))
+(irregex-match-string (#(procedure) irregex-match-string (*) *))
 (irregex-match-subchunk (#(procedure #:enforce) irregex-match-subchunk ((struct regexp-match) #!optional *) *))
-(irregex-match-substring (procedure irregex-match-substring (* #!optional *) *))
+(irregex-match-substring (#(procedure) irregex-match-substring (* #!optional *) *))
 (irregex-match/chunked (#(procedure #:enforce) irregex-match/chunked (* * * #!optional fixnum) *))
 
-(irregex-names (#(procedure #:enforce) irregex-names ((struct regexp)) *)
+(irregex-names (#(procedure #:clean #:enforce) irregex-names ((struct regexp)) *)
 	       (((struct regexp)) (##sys#slot #(1) '8)))
 
 (irregex-new-matches (procedure irregex-new-matches (*) *))
 
-(irregex-nfa (#(procedure #:enforce) irregex-nfa ((struct regexp)) *)
+(irregex-nfa (#(procedure #:clean #:enforce) irregex-nfa ((struct regexp)) *)
 	     (((struct regexp)) (##sys#slot #(1) '4)))
 
-(irregex-num-submatches (#(procedure #:enforce) irregex-num-submatches ((struct regexp))
+(irregex-num-submatches (#(procedure #:clean #:enforce) irregex-num-submatches ((struct regexp))
 				   fixnum)
 			(((struct regexp)) (##sys#slot #(1) '6)))
 
@@ -1276,9 +1285,9 @@
 (irregex-split (#(procedure #:enforce) irregex-split (* string #!optional fixnum fixnum) list))
 (irregex-search/chunked (#(procedure #:enforce) irregex-search/chunked (* procedure * #!optional fixnum fixnum *) *))
 (irregex-match-valid-index? 
- (#(procedure #:enforce) irregex-match-valid-index? ((struct regexp-match) *) boolean))
+ (#(procedure #:clean #:enforce) irregex-match-valid-index? ((struct regexp-match) *) boolean))
 
-(irregex? (#(procedure #:predicate (struct regexp)) irregex? (*) boolean))
+(irregex? (#(procedure #:pure #:predicate (struct regexp)) irregex? (*) boolean))
 
 (make-irregex-chunker
  (#(procedure #:enforce) make-irregex-chunker 
@@ -1290,37 +1299,37 @@
 	     (procedure (* fixnum * fixnum) string)
 	     (procedure (* fixnum * fixnum) *))
 	    *))
-(maybe-string->sre (procedure maybe-string->sre (*) *))
-(sre->irregex (procedure sre->irregex (#!rest) *))
-(string->irregex (#(procedure #:enforce) string->irregex (string #!rest) *))
-(string->sre (#(procedure #:enforce) string->sre (string #!rest) *))
+(maybe-string->sre (#(procedure #:clean) maybe-string->sre (*) *))
+(sre->irregex (#(procedure #:clean) sre->irregex (#!rest) *))
+(string->irregex (#(procedure #:clean #:enforce) string->irregex (string #!rest) *))
+(string->sre (#(procedure #:clean #:enforce) string->sre (string #!rest) *))
 
 
 ;; lolevel
 
-(address->pointer (#(procedure #:enforce) address->pointer (fixnum) pointer)
+(address->pointer (#(procedure #:clean #:enforce) address->pointer (fixnum) pointer)
 		  ((fixnum) (##sys#address->pointer #(1))))
 
 (align-to-word
- (procedure 
+ (#(procedure #:clean) 
   align-to-word
   ((or number pointer locative procedure port)) 
   (or pointer number)))
 
-(allocate (#(procedure #:enforce) allocate (fixnum) (or boolean pointer)))
-(block-ref (#(procedure #:enforce) block-ref (* fixnum) *))
+(allocate (#(procedure #:clean #:enforce) allocate (fixnum) (or boolean pointer)))
+(block-ref (#(procedure #:clean #:enforce) block-ref (* fixnum) *))
 (block-set! (#(procedure #:enforce) block-set! (* fixnum *) *))
-(extend-procedure (#(procedure #:enforce) extend-procedure (procedure *) procedure))
-(extended-procedure? (procedure extended-procedure (*) boolean))
-(free (#(procedure #:enforce) free (pointer) undefined))
-(locative->object (#(procedure #:enforce) locative->object (locative) *))
-(locative-ref (#(procedure #:enforce) locative-ref (locative) *))
+(extend-procedure (#(procedure #:clean #:enforce) extend-procedure (procedure *) procedure))
+(extended-procedure? (#(procedure #:clean) extended-procedure (*) boolean))
+(free (#(procedure #:clean #:enforce) free (pointer) undefined))
+(locative->object (#(procedure #:clean #:enforce) locative->object (locative) *))
+(locative-ref (#(procedure #:clean #:enforce) locative-ref (locative) *))
 (locative-set! (#(procedure #:enforce) locative-set! (locative *) *))
-(locative? (#(procedure #:predicate locative) locative? (*) boolean))
-(make-locative (#(procedure #:enforce) make-locative (* #!optional fixnum) locative))
-(make-pointer-vector (#(procedure #:enforce) make-pointer-vector (fixnum #!optional pointer) pointer-vector))
-(make-record-instance (procedure make-record-instance (symbol #!rest) *))
-(make-weak-locative (#(procedure #:enforce) make-weak-locative (* #!optional fixnum) locative))
+(locative? (#(procedure #:pure #:predicate locative) locative? (*) boolean))
+(make-locative (#(procedure #:clean #:enforce) make-locative (* #!optional fixnum) locative))
+(make-pointer-vector (#(procedure #:clean #:enforce) make-pointer-vector (fixnum #!optional pointer) pointer-vector))
+(make-record-instance (#(procedure #:clean) make-record-instance (symbol #!rest) *))
+(make-weak-locative (#(procedure #:clean #:enforce) make-weak-locative (* #!optional fixnum) locative))
 
 (move-memory! (#(procedure #:enforce) move-memory! (* * #!optional fixnum fixnum fixnum) *)
 	      ((pointer pointer fixnum)
@@ -1343,84 +1352,84 @@
 (null-pointer deprecated)
 (null-pointer? deprecated)
 
-(number-of-bytes (procedure number-of-bytes (*) fixnum)
+(number-of-bytes (#(procedure #:clean) number-of-bytes (*) fixnum)
 		 (((or blob string)) (##sys#size #(1)))
 		 (((or port procedure symbol pair vector locative float pointer-vector))
 		  ;; would be applicable to all structure types, but we can't specify
 		  ;; "(struct *)" (yet)
 		  (##core#inline "C_w2b" (##sys#size #(1)))))
 
-(number-of-slots (procedure number-of-slots (*) fixnum)
+(number-of-slots (#(procedure #:clean) number-of-slots (*) fixnum)
 		 (((or vector symbol pair)) (##sys#size #(1))))
 
-(object->pointer (procedure object->pointer (*) *))
+(object->pointer (#(procedure #:clean) object->pointer (*) *))
 (object-become! (procedure object-become! (list) *))
-(object-copy (procedure object-copy (*) *))
-(object-evict (#(procedure #:enforce) object-evict (* #!optional (procedure (fixnum) pointer)) *))
-(object-evict-to-location (#(procedure #:enforce) object-evict-to-location (* (or pointer locative procedure port) #!optional fixnum) * pointer))
-(object-evicted? (procedure object-evicted? (*) boolean))
+(object-copy (#(procedure #:clean) object-copy (*) *))
+(object-evict (#(procedure #:clean #:enforce) object-evict (* #!optional (procedure (fixnum) pointer)) *))
+(object-evict-to-location (#(procedure #:clean #:enforce) object-evict-to-location (* (or pointer locative procedure port) #!optional fixnum) * pointer))
+(object-evicted? (#(procedure #:pure) object-evicted? (*) boolean))
 (object-release (#(procedure #:enforce) object-release (* #!optional (procedure (pointer) *)) *))
-(object-size (procedure object-size (*) fixnum))
+(object-size (#(procedure #:clean) object-size (*) fixnum))
 (object-unevict (procedure object-unevict (* #!optional *) *))
-(pointer+ (#(procedure #:enforce) pointer+ ((or pointer procedure port locative) fixnum) pointer))
+(pointer+ (#(procedure #:clean #:enforce) pointer+ ((or pointer procedure port locative) fixnum) pointer))
 
-(pointer->address (#(procedure #:enforce) pointer->address ((or pointer procedure port locative)) number)
+(pointer->address (#(procedure #:clean #:enforce) pointer->address ((or pointer procedure port locative)) number)
 		  ((pointer) (##sys#pointer->address #(1))))
 
-(pointer->object (#(procedure #:enforce) pointer->object (pointer) *)
+(pointer->object (#(procedure #:clean #:enforce) pointer->object (pointer) *)
 		 ((pointer) (##core#inline "C_pointer_to_object" #(1))))
 
-(pointer-like? (procedure pointer-like? (*) boolean)
+(pointer-like? (#(procedure #:pure) pointer-like? (*) boolean) ;XXX predicate?
 	       (((or pointer locative procedure port)) (let ((#(tmp) #(1))) '#t)))
 
-(pointer-f32-ref (#(procedure #:enforce) pointer-f32-ref (pointer) number))
-(pointer-f32-set! (#(procedure #:enforce) pointer-f32-set! (pointer number) undefined))
-(pointer-f64-ref (#(procedure #:enforce) pointer-f64-ref (pointer) number))
-(pointer-f64-set! (#(procedure #:enforce) pointer-f64-set! (pointer number) undefined))
-(pointer-vector (#(procedure #:enforce) pointer-vector (#!rest pointer-vector) boolean))
+(pointer-f32-ref (#(procedure #:clean #:enforce) pointer-f32-ref (pointer) number))
+(pointer-f32-set! (#(procedure #:clean #:enforce) pointer-f32-set! (pointer number) undefined))
+(pointer-f64-ref (#(procedure #:clean #:enforce) pointer-f64-ref (pointer) number))
+(pointer-f64-set! (#(procedure #:clean #:enforce) pointer-f64-set! (pointer number) undefined))
+(pointer-vector (#(procedure #:clean #:enforce) pointer-vector (#!rest pointer-vector) boolean))
 
-(pointer-vector? (#(procedure #:predicate pointer-vector) pointer-vector? (*) boolean))
+(pointer-vector? (#(procedure #:pure #:predicate pointer-vector) pointer-vector? (*) boolean))
 
-(pointer-vector-fill! (#(procedure #:enforce) pointer-vector-fill! (pointer-vector pointer) undefined))
+(pointer-vector-fill! (#(procedure #:clean #:enforce) pointer-vector-fill! (pointer-vector pointer) undefined))
 
-(pointer-vector-length (#(procedure #:enforce) pointer-vector-length (pointer-vector) fixnum)
+(pointer-vector-length (#(procedure #:clean #:enforce) pointer-vector-length (pointer-vector) fixnum)
 		       ((pointer-vector) (##sys#slot #(1) '1)))
 
-(pointer-vector-ref (#(procedure #:enforce) pointer-vector-ref (pointer-vector fixnum) pointer))
-(pointer-vector-set! (#(procedure #:enforce) pointer-vector-set! (pointer-vector fixnum pointer) undefined))
-(pointer-s16-ref (#(procedure #:enforce) pointer-s16-ref (pointer) fixnum))
-(pointer-s16-set! (#(procedure #:enforce) pointer-s16-set! (pointer fixnum) undefined))
-(pointer-s32-ref (#(procedure #:enforce) pointer-s32-ref (pointer) number))
-(pointer-s32-set! (#(procedure #:enforce) pointer-s32-set! (pointer number) undefined))
-(pointer-s8-ref (#(procedure #:enforce) pointer-s8-ref (pointer) fixnum))
-(pointer-s8-set! (#(procedure #:enforce) pointer-s8-set! (pointer fixnum) undefined))
+(pointer-vector-ref (#(procedure #:clean #:enforce) pointer-vector-ref (pointer-vector fixnum) pointer))
+(pointer-vector-set! (#(procedure #:clean #:enforce) pointer-vector-set! (pointer-vector fixnum pointer) undefined))
+(pointer-s16-ref (#(procedure #:clean #:enforce) pointer-s16-ref (pointer) fixnum))
+(pointer-s16-set! (#(procedure #:clean #:enforce) pointer-s16-set! (pointer fixnum) undefined))
+(pointer-s32-ref (#(procedure #:clean #:enforce) pointer-s32-ref (pointer) number))
+(pointer-s32-set! (#(procedure #:clean #:enforce) pointer-s32-set! (pointer number) undefined))
+(pointer-s8-ref (#(procedure #:clean #:enforce) pointer-s8-ref (pointer) fixnum))
+(pointer-s8-set! (#(procedure #:clean #:enforce) pointer-s8-set! (pointer fixnum) undefined))
 
-(pointer-tag (#(procedure #:enforce) pointer-tag ((or pointer locative procedure port)) (or boolean number))
+(pointer-tag (#(procedure #:clean #:enforce) pointer-tag ((or pointer locative procedure port)) (or boolean number))
 	     (((or locative procedure port)) (let ((#(tmp) #(1))) '#f)))
 
-(pointer-u16-ref (#(procedure #:enforce) pointer-u16-ref (pointer) fixnum))
-(pointer-u16-set! (#(procedure #:enforce) pointer-u16-set! (pointer fixnum) undefined))
-(pointer-u32-ref (#(procedure #:enforce) pointer-u32-ref (pointer) number))
-(pointer-u32-set! (#(procedure #:enforce) pointer-u32-set! (pointer number) undefined))
-(pointer-u8-ref (#(procedure #:enforce) pointer-u8-ref (pointer) fixnum))
-(pointer-u8-set! (#(procedure #:enforce) pointer-u8-set! (pointer fixnum) undefined))
+(pointer-u16-ref (#(procedure #:clean #:enforce) pointer-u16-ref (pointer) fixnum))
+(pointer-u16-set! (#(procedure #:clean #:enforce) pointer-u16-set! (pointer fixnum) undefined))
+(pointer-u32-ref (#(procedure #:clean #:enforce) pointer-u32-ref (pointer) number))
+(pointer-u32-set! (#(procedure #:clean #:enforce) pointer-u32-set! (pointer number) undefined))
+(pointer-u8-ref (#(procedure #:clean #:enforce) pointer-u8-ref (pointer) fixnum))
+(pointer-u8-set! (#(procedure #:clean #:enforce) pointer-u8-set! (pointer fixnum) undefined))
 
-(pointer=? (#(procedure #:enforce) pointer=? ((or pointer locative procedure port)
+(pointer=? (#(procedure #:clean #:enforce) pointer=? ((or pointer locative procedure port)
 				  (or pointer locative procedure port)) boolean)
 	   ((pointer pointer) (##core#inline "C_pointer_eqp" #(1) #(2))))
 
-(pointer? (#(procedure #:predicate pointer) pointer? (*) boolean))
+(pointer? (#(procedure #:clean #:predicate pointer) pointer? (*) boolean))
 
-(procedure-data (#(procedure #:enforce) procedure-data (procedure) *))
-(record->vector (procedure record->vector (*) vector))
-(record-instance? (procedure record-instance? (*) boolean))
-(record-instance-length (procedure record-instance-length (*) fixnum))
-(record-instance-slot (#(procedure #:enforce) record-instance-slot (* fixnum) *))
-(record-instance-slot-set! (#(procedure #:enforce) record-instance-slot-set! (* fixnum *) undefined))
-(record-instance-type (procedure record-instance-type (*) *))
-(set-procedure-data! (#(procedure #:enforce) set-procedure-data! (procedure *) undefined))
-(tag-pointer (#(procedure #:enforce) tag-pointer (pointer *) pointer))
-(tagged-pointer? (#(procedure #:enforce) tagged-pointer? (* #!optional *) boolean))
+(procedure-data (#(procedure #:clean #:enforce) procedure-data (procedure) *))
+(record->vector (#(procedure #:clean) record->vector (*) vector))
+(record-instance? (#(procedure #:clean) record-instance? (*) boolean))
+(record-instance-length (#(procedure #:clean) record-instance-length (*) fixnum))
+(record-instance-slot (#(procedure #:clean #:enforce) record-instance-slot (* fixnum) *))
+(record-instance-slot-set! (#(procedure #:clean #:enforce) record-instance-slot-set! (* fixnum *) undefined))
+(record-instance-type (#(procedure #:clean) record-instance-type (*) *))
+(set-procedure-data! (#(procedure #:clean #:enforce) set-procedure-data! (procedure *) undefined))
+(tag-pointer (#(procedure #:clean #:enforce) tag-pointer (pointer *) pointer))
+(tagged-pointer? (#(procedure #:clean #:enforce) tagged-pointer? (* #!optional *) boolean))
 
 
 ;; ports
@@ -1428,16 +1437,16 @@
 (call-with-input-string (#(procedure #:enforce) call-with-input-string (string (procedure (port) . *)) . *))
 (call-with-output-string (#(procedure #:enforce) call-with-output-string ((procedure (port) . *)) string))
 (copy-port (#(procedure #:enforce) copy-port (* * #!optional (procedure (*) *) (procedure (* port) *)) undefined)) 
-(make-input-port (#(procedure #:enforce) make-input-port ((procedure () char) (procedure () *) (procedure () . *) #!optional * * * *) port))
-(make-output-port (#(procedure #:enforce) make-output-port ((procedure (string) . *) (procedure () . *) #!optional (procedure () . *)) port))
+(make-input-port (#(procedure #:clean #:enforce) make-input-port ((procedure () char) (procedure () *) (procedure () . *) #!optional * * * *) port))
+(make-output-port (#(procedure #:clean #:enforce) make-output-port ((procedure (string) . *) (procedure () . *) #!optional (procedure () . *)) port))
 (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))))
 
 (port-fold (#(procedure #:enforce) port-fold ((procedure (* *) *) * (procedure () *)) *))
-(make-broadcast-port (#(procedure #:enforce) make-broadcast-port (#!rest port) port))
-(make-concatenated-port (#(procedure #:enforce) make-concatenated-port (port #!rest port) port))
+(make-broadcast-port (#(procedure #:clean #:enforce) make-broadcast-port (#!rest port) port))
+(make-concatenated-port (#(procedure #:clean #:enforce) make-concatenated-port (port #!rest port) port))
 (with-error-output-to-port (#(procedure #:enforce) with-error-output-to-port (port (procedure () . *)) . *))
 (with-input-from-port (#(procedure #:enforce) with-input-from-port (port (procedure () . *)) . *))
 (with-input-from-string (#(procedure #:enforce) with-input-from-string (string (procedure () . *)) . *))
@@ -1450,33 +1459,33 @@
 (_exit (procedure _exit (fixnum) noreturn))
 (call-with-input-pipe (#(procedure #:enforce) call-with-input-pipe (string (procedure (port) . *) #!optional symbol) . *))
 (call-with-output-pipe (#(procedure #:enforce) call-with-output-pipe (string (procedure (port) . *) #!optional symbol) . *))
-(change-directory (#(procedure #:enforce) change-directory (string) string))
-(change-file-mode (#(procedure #:enforce) change-file-mode (string fixnum) undefined))
-(change-file-owner (#(procedure #:enforce) change-file-owner (string fixnum fixnum) undefined))
-(close-input-pipe (#(procedure #:enforce) close-input-pipe (port) fixnum))
-(close-output-pipe (#(procedure #:enforce) close-output-pipe (port) fixnum))
-(create-directory (#(procedure #:enforce) create-directory (string #!optional *) string))
-(create-fifo (#(procedure #:enforce) create-fifo (string #!optional fixnum) undefined))
+(change-directory (#(procedure #:clean #:enforce) change-directory (string) string))
+(change-file-mode (#(procedure #:clean #:enforce) change-file-mode (string fixnum) undefined))
+(change-file-owner (#(procedure #:clean #:enforce) change-file-owner (string fixnum fixnum) undefined))
+(close-input-pipe (#(procedure #:clean #:enforce) close-input-pipe (port) fixnum))
+(close-output-pipe (#(procedure #:clean #:enforce) close-output-pipe (port) fixnum))
+(create-directory (#(procedure #:clean #:enforce) create-directory (string #!optional *) string))
+(create-fifo (#(procedure #:clean #:enforce) create-fifo (string #!optional fixnum) undefined))
 (create-pipe (procedure create-pipe () fixnum fixnum))
-(create-session (procedure create-session () fixnum))
-(create-symbolic-link (#(procedure #:enforce) create-symbolic-link (string string) undefined))
+(create-session (#(procedure #:clean) create-session () fixnum))
+(create-symbolic-link (#(procedure #:clean #:enforce) create-symbolic-link (string string) undefined))
 
 ;; extra arg for "parameterize" - ugh, what a hack...
-(current-directory (#(procedure #:enforce) current-directory (#!optional string *) string))
+(current-directory (#(procedure #:clean #:enforce) current-directory (#!optional string *) string))
 
-(current-effective-group-id (procedure current-effective-group-id () fixnum))
-(current-effective-user-id (procedure current-effective-user-id () fixnum))
-(current-effective-user-name (procedure current-effective-user-name () string))
+(current-effective-group-id (#(procedure #:clean) current-effective-group-id () fixnum))
+(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 get-environment-variables () (list string)))
-(current-group-id (procedure current-group-id () fixnum))
-(current-process-id (procedure current-process-id () fixnum))
-(current-user-id (procedure current-user-id () fixnum))
-(current-user-name (procedure current-user-name () string))
-(delete-directory (#(procedure #:enforce) delete-directory (string) string))
-(directory (#(procedure #:enforce) directory (string #!optional *) (list string)))
-(directory? (#(procedure #:enforce) directory? ((or string fixnum)) boolean))
-(duplicate-fileno (#(procedure #:enforce) duplicate-fileno (fixnum #!optional fixnum) fixnum))
+(get-environment-variables (#(procedure #:clean) get-environment-variables () (list 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? ((or string fixnum)) boolean))
+(duplicate-fileno (#(procedure #:clean #:enforce) duplicate-fileno (fixnum #!optional fixnum) fixnum))
 (errno/2big fixnum)
 (errno/acces fixnum)
 (errno/again fixnum)
@@ -1521,55 +1530,55 @@
 (fcntl/getfl fixnum)
 (fcntl/setfd fixnum)
 (fcntl/setfl fixnum)
-(file-access-time (#(procedure #:enforce) file-access-time ((or string fixnum)) number))
-(file-change-time (#(procedure #:enforce) file-change-time ((or string fixnum)) number))
-(file-close (#(procedure #:enforce) file-close (fixnum) undefined))
-(file-control (#(procedure #:enforce) file-control (fixnum fixnum #!optional fixnum) fixnum))
-(file-creation-mode (#(procedure #:enforce) file-creation-mode (#!optional fixnum) fixnum))
-(file-execute-access? (#(procedure #:enforce) file-execute-access? (string) boolean))
-(file-link (#(procedure #:enforce) file-link (string string) undefined))
-(file-lock (#(procedure #:enforce) file-lock (port #!optional fixnum *) (struct lock)))
-(file-lock/blocking (#(procedure #:enforce) file-lock/blocking (port #!optional fixnum *) (struct lock)))
-(file-mkstemp (#(procedure #:enforce) file-mkstemp (string) fixnum string))
-(file-modification-time (#(procedure #:enforce) file-modification-time ((or string fixnum)) number))
-(file-open (#(procedure #:enforce) file-open (string fixnum #!optional fixnum) fixnum))
-(file-owner (#(procedure #:enforce) file-owner ((or string fixnum)) fixnum))
-(file-permissions (#(procedure #:enforce) file-permissions ((or string fixnum)) fixnum))
-(file-position (#(procedure #:enforce) file-position ((or port fixnum)) fixnum))
-(file-read (#(procedure #:enforce) file-read (fixnum fixnum #!optional *) list))
-(file-read-access? (#(procedure #:enforce) file-read-access? (string) boolean))
-(file-select (#(procedure #:enforce) file-select ((list fixnum) (list fixnum) #!optional fixnum) * *))
-(file-size (#(procedure #:enforce) file-size ((or string fixnum)) number))
-(file-stat (#(procedure #:enforce) file-stat ((or string fixnum) #!optional *) (vector number)))
-(file-test-lock (#(procedure #:enforce) file-test-lock (port #!optional fixnum *) boolean))
-(file-truncate (#(procedure #:enforce) file-truncate ((or string fixnum) fixnum) undefined))
-(file-type (#(procedure #:enforce) ((or string fixnum) #!optional * *) symbol))
-(file-unlock (#(procedure #:enforce) file-unlock ((struct lock)) undefined))
-(file-write (#(procedure #:enforce) file-write (fixnum * #!optional fixnum) fixnum))
-(file-write-access? (#(procedure #:enforce) file-write-access? (string) boolean))
+(file-access-time (#(procedure #:clean #:enforce) file-access-time ((or string fixnum)) number))
+(file-change-time (#(procedure #:clean #:enforce) file-change-time ((or string fixnum)) number))
+(file-close (#(procedure #:clean #:enforce) file-close (fixnum) undefined))
+(file-control (#(procedure #:clean #:enforce) file-control (fixnum fixnum #!optional fixnum) fixnum))
+(file-creation-mode (#(procedure #:clean #:enforce) file-creation-mode (#!optional fixnum) fixnum))
+(file-execute-access? (#(procedure #:clean #:enforce) file-execute-access? (string) boolean))
+(file-link (#(procedure #:clean #:enforce) file-link (string string) undefined))
+(file-lock (#(procedure #:clean #:enforce) file-lock (port #!optional fixnum *) (struct lock)))
+(file-lock/blocking (#(procedure #:clean #:enforce) file-lock/blocking (port #!optional fixnum *) (struct lock)))
+(file-mkstemp (#(procedure #:clean #:enforce) file-mkstemp (string) fixnum string))
+(file-modification-time (#(procedure #:clean #:enforce) file-modification-time ((or string fixnum)) number))
+(file-open (#(procedure #:clean #:enforce) file-open (string fixnum #!optional fixnum) fixnum))
+(file-owner (#(procedure #:clean #:enforce) file-owner ((or string fixnum)) fixnum))
+(file-permissions (#(procedure #:clean #:enforce) file-permissions ((or string fixnum)) fixnum))
+(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-size (#(procedure #:clean #:enforce) file-size ((or string fixnum)) number))
+(file-stat (#(procedure #:clean #:enforce) file-stat ((or string fixnum) #!optional *) (vector 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))
+(file-unlock (#(procedure #:clean #:enforce) file-unlock ((struct lock)) undefined))
+(file-write (#(procedure #:clean #:enforce) file-write (fixnum * #!optional fixnum) fixnum))
+(file-write-access? (#(procedure #:clean #:enforce) file-write-access? (string) boolean))
 (fileno/stderr fixnum)
 (fileno/stdin fixnum)
 (fileno/stdout fixnum)
 (find-files (#(procedure #:enforce) find-files (string #!rest) list))
-(get-groups (procedure get-groups () list))
-(get-host-name (procedure get-host-name () string))
-(glob (#(procedure #:enforce) glob (#!rest string) list))
-(group-information (#(procedure #:enforce) group-information (fixnum #!optional *) *))
-(initialize-groups (#(procedure #:enforce) initialize-groups (string fixnum) undefined))
-(local-time->seconds (#(procedure #:enforce) local-time->seconds ((vector number)) number))
-(local-timezone-abbreviation (procedure local-timezone-abbreviation () string))
-(map-file-to-memory (#(procedure #:enforce) map-file-to-memory (* fixnum fixnum fixnum fixnum #!optional fixnum) (struct mmap)))
+(get-groups (#(procedure #:clean) get-groups () list))
+(get-host-name (#(procedure #:clean) get-host-name () string))
+(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-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)
 (map/file fixnum)
 (map/fixed fixnum)
 (map/private fixnum)
 (map/shared fixnum)
-(memory-mapped-file-pointer (#(procedure #:enforce) memory-mapped-file-pointer ((struct mmap)) pointer))
-(memory-mapped-file? (procedure memory-mapped-file? (*) boolean))
-(open-input-file* (#(procedure #:enforce) open-input-file* (fixnum #!optional symbol) port))
-(open-input-pipe (#(procedure #:enforce) open-input-pipe (string #!optional symbol) port))
-(open-output-file* (#(procedure #:enforce) open-output-file* (fixnum #!optional symbol) port))
-(open-output-pipe (#(procedure #:enforce) open-output-pipe (string #!optional symbol) port))
+(memory-mapped-file-pointer (#(procedure #:clean #:enforce) memory-mapped-file-pointer ((struct mmap)) pointer))
+(memory-mapped-file? (#(procedure #:clean #:predicate (struct mmap)) memory-mapped-file? (*) boolean))
+(open-input-file* (#(procedure #:clean #:enforce) open-input-file* (fixnum #!optional symbol) port))
+(open-input-pipe (#(procedure #:clean #:enforce) open-input-pipe (string #!optional symbol) port))
+(open-output-file* (#(procedure #:clean #:enforce) open-output-file* (fixnum #!optional symbol) port))
+(open-output-pipe (#(procedure #:clean #:enforce) open-output-pipe (string #!optional symbol) port))
 (open/append fixnum)
 (open/binary fixnum)
 (open/creat fixnum)
@@ -1585,7 +1594,7 @@
 (open/trunc fixnum)
 (open/write fixnum)
 (open/wronly fixnum)
-(parent-process-id (procedure parent-process-id () fixnum))
+(parent-process-id (#(procedure #:clean) parent-process-id () fixnum))
 (perm/irgrp fixnum)
 (perm/iroth fixnum)
 (perm/irusr fixnum)
@@ -1602,43 +1611,43 @@
 (perm/ixoth fixnum)
 (perm/ixusr fixnum)
 (pipe/buf fixnum)
-(port->fileno (#(procedure #:enforce) port->fileno (port) fixnum))
-(process (#(procedure #:enforce) process (string #!optional (list string) (list string)) port port fixnum))
-(process* (#(procedure #:enforce) process* (string #!optional (list string) (list string)) port port 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-execute
- (#(procedure #:enforce) process-execute (string #!optional (list string) (list string)) noreturn))
+ (#(procedure #:clean #:enforce) process-execute (string #!optional (list string) (list string)) noreturn))
 
 (process-fork (#(procedure #:enforce) process-fork (#!optional (procedure () . *)) fixnum))
-(process-group-id (#(procedure #:enforce) process-group-id () fixnum))
-(process-run (#(procedure #:enforce) process-run (string #!optional (list string)) fixnum))
-(process-signal (#(procedure #:enforce) process-signal (fixnum #!optional fixnum) undefined))
-(process-wait (#(procedure #:enforce) process-wait (fixnum #!optional *) fixnum fixnum fixnum))
+(process-group-id (#(procedure #:clean #:enforce) process-group-id () fixnum))
+(process-run (#(procedure #:clean #:enforce) process-run (string #!optional (list 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)
 (prot/none fixnum)
 (prot/read fixnum)
 (prot/write fixnum)
-(read-symbolic-link (#(procedure #:enforce) read-symbolic-link (string) string))
-(regular-file? (#(procedure #:enforce) regular-file? ((or string fixnum)) boolean))
-(seconds->local-time (#(procedure #:enforce) seconds->local-time (#!optional number) (vector number)))
-(seconds->string (#(procedure #:enforce) seconds->string (#!optional number) string))
-(seconds->utc-time (#(procedure #:enforce) seconds->utc-time (#!optional number) (vector number)))
+(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->string (#(procedure #:clean #:enforce) seconds->string (#!optional number) string))
+(seconds->utc-time (#(procedure #:clean #:enforce) seconds->utc-time (#!optional number) (vector number)))
 (seek/cur fixnum)
 (seek/end fixnum)
 (seek/set fixnum)
-(set-alarm! (#(procedure #:enforce) set-alarm! (number) number))
-(set-buffering-mode! (#(procedure #:enforce) set-buffering-mode! (port symbol #!optional fixnum) undefined))
-(set-file-position! (#(procedure #:enforce) set-file-position! ((or port fixnum) fixnum #!optional fixnum) undefined))
-(set-groups! (#(procedure #:enforce) set-groups! (list) undefined))
-(set-root-directory! (#(procedure #:enforce) set-root-directory! (string) undefined))
-(set-signal-handler! (#(procedure #:enforce) set-signal-handler! (fixnum (procedure (fixnum) . *)) undefined))
-(set-signal-mask! (#(procedure #:enforce) set-signal-mask! ((list fixnum)) undefined))
-(setenv (#(procedure #:enforce) setenv (string string) undefined))
-(signal-handler (#(procedure #:enforce) signal-handler (fixnum) (procedure (fixnum) . *)))
-(signal-mask (procedure signal-mask () fixnum))
-(signal-mask! (#(procedure #:enforce) signal-mask! (fixnum) undefined))
-(signal-masked? (#(procedure #:enforce) signal-masked? (fixnum) boolean))
-(signal-unmask! (#(procedure #:enforce) signal-unmask! (fixnum) undefined))
+(set-alarm! (#(procedure #:clean #:enforce) set-alarm! (number) number))
+(set-buffering-mode! (#(procedure #:clean #:enforce) set-buffering-mode! (port symbol #!optional fixnum) undefined))
+(set-file-position! (#(procedure #:clean #:enforce) set-file-position! ((or port fixnum) fixnum #!optional fixnum) undefined))
+(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 (procedure (fixnum) . *)) undefined))
+(set-signal-mask! (#(procedure #:clean #:enforce) set-signal-mask! ((list 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))
+(signal-mask! (#(procedure #:clean #:enforce) signal-mask! (fixnum) undefined))
+(signal-masked? (#(procedure #:clean #:enforce) signal-masked? (fixnum) boolean))
+(signal-unmask! (#(procedure #:clean #:enforce) signal-unmask! (fixnum) undefined))
 (signal/abrt fixnum)
 (signal/alrm fixnum)
 (signal/chld fixnum)
@@ -1665,30 +1674,30 @@
 (signal/xcpu fixnum)
 (signal/xfsz fixnum)
 (signals-list list)
-(sleep (#(procedure #:enforce) sleep (fixnum) fixnum))
-(block-device? (#(procedure #:enforce) block-device? ((or string fixnum)) boolean))
-(character-device? (#(procedure #:enforce) character-device? ((or string fixnum)) boolean))
-(fifo? (#(procedure #:enforce) fifo? ((or string fixnum)) boolean))
-(socket? (#(procedure #:enforce) socket? ((or string fixnum)) boolean))
-(string->time (#(procedure #:enforce) string->time (string #!optional string) vector))
-(symbolic-link? (#(procedure #:enforce) symbolic-link? ((or string fixnum)) boolean))
-(system-information (procedure system-information () list))
-(terminal-name (#(procedure #:enforce) terminal-name (port) string))
-(terminal-port? (#(procedure #:enforce) terminal-port? (port) boolean))
-(terminal-size (#(procedure #:enforce) terminal-size (port) fixnum fixnum))
-(time->string (#(procedure #:enforce) time->string (vector #!optional string) string))
-(unmap-file-from-memory (#(procedure #:enforce) unmap-file-from-memory ((struct mmap) #!optional fixnum) undefined))
-(unsetenv (#(procedure #:enforce) unsetenv (string) undefined))
-(user-information (#(procedure #:enforce) user-information ((or string fixnum) #!optional *) *))
-(utc-time->seconds (#(procedure #:enforce) utc-time->seconds ((vector number)) number))
+(sleep (#(procedure #:clean #:enforce) sleep (fixnum) fixnum))
+(block-device? (#(procedure #:clean #:enforce) block-device? ((or string fixnum)) boolean))
+(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))
+(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))
+(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))
 (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 alist-cons (a b (list c)) (pair a (pair b (list c))))))
-(alist-copy (forall (a) (#(procedure #:enforce) alist-copy ((list a)) (list a))))
+(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) *)))
@@ -1702,19 +1711,19 @@
  (forall (a b) (#(procedure #:enforce) append-map! ((procedure (a #!rest) (list b)) (list a) #!rest list)
 			   (list b))))
 
-(append-reverse (#(procedure #:enforce) append-reverse (list list) list))
+(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))))
-(car+cdr (forall (a b) (#(procedure #:enforce) car+cdr ((pair a b)) a b)))
-(circular-list (procedure circular-list (#!rest) list))
+(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 circular-list? (*) boolean)
+(circular-list? (#(procedure #:clean) circular-list? (*) boolean)
 		((null) (let ((#(tmp) #(1))) '#f)))
 
-(concatenate (#(procedure #:enforce) concatenate ((list list)) list))
+(concatenate (#(procedure #:clean #:enforce) concatenate ((list list)) list))
 (concatenate! (#(procedure #:enforce) concatenate! ((list list)) list))
-(cons* (forall (a) (procedure cons* (a #!rest) (pair a *))))
+(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))))
@@ -1725,17 +1734,17 @@
 (delete-duplicates!
  (forall (a) (#(procedure #:enforce) delete-duplicates! ((list a) #!optional (procedure (a *) *)) (list a))))
 
-(dotted-list? (procedure dotted-list? (*) boolean))
+(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))))
-(eighth (#(procedure #:enforce) eighth (pair) *))
+(eighth (#(procedure #:clean #:enforce) eighth (pair) *))
 
 (every
  (forall (a) (#(procedure #:enforce) every ((procedure (a #!rest) *) (list a) #!rest list) *)))
 
-(fifth (#(procedure #:enforce) fifth (pair) *))
+(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))))
 
@@ -1745,27 +1754,27 @@
 (find (forall (a) (#(procedure #:enforce) find ((procedure (a) *) (list a)) *)))
 (find-tail (forall (a) (#(procedure #:enforce) find-tail ((procedure (a) *) (list a)) *)))
 
-(first (forall (a) (#(procedure #:enforce) first ((pair a *)) a))
+(first (forall (a) (#(procedure #:clean #:enforce) first ((pair a *)) a))
        ((pair) (##core#inline "C_u_i_car" #(1))))
 
 (fold (#(procedure #:enforce) fold ((procedure (* #!rest) *) * #!rest list) *)) ;XXX
 (fold-right (#(procedure #:enforce) fold-right ((procedure (* #!rest) *) * #!rest list) *)) ;XXX
 
-(fourth (forall (a) (#(procedure #:enforce) fourth ((pair * (pair * (pair * (pair a *))))) a))
+(fourth (forall (a) (#(procedure #:clean #:enforce) fourth ((pair * (pair * (pair * (pair a *))))) a))
 	(((pair * (pair * (pair * (pair * *)))))
 	 (##core#inline "C_u_i_car" 
 			(##core#inline "C_u_i_cdr"
 				       (##core#inline "C_u_i_cdr"
 						      (##core#inline "C_u_i_cdr" #(1)))))))
 
-(iota (#(procedure #:enforce) iota (fixnum #!optional fixnum fixnum) (list number)))
-(last (#(procedure #:enforce) last (pair) *))
-(last-pair (#(procedure #:enforce) last-pair (pair) *))
-(length+ (#(procedure #:enforce) length+ (list) *))
-(list-copy (forall (a) (#(procedure #:enforce) list-copy ((list a)) (list a))))
+(iota (#(procedure #:clean #:enforce) iota (fixnum #!optional fixnum fixnum) (list 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= (#(procedure #:enforce) list= (#!rest list) boolean))
+(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))))
@@ -1811,7 +1820,7 @@
  (forall (a) (#(procedure #:enforce) lset= ((procedure (a a) *) (list a) #!rest (list a)) boolean)))
 
 ;; see note about "make-vector", above
-(make-list (forall (a) (#(procedure #:enforce) make-list (fixnum #!optional a) list)))
+(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))))
@@ -1821,13 +1830,13 @@
   (a b)
   (#(procedure #:enforce) map-in-order ((procedure (a #!rest) b) (list a) #!rest list) (list b))))
 
-(ninth (#(procedure #:enforce) ninth (pair) *))
+(ninth (#(procedure #:clean #:enforce) ninth (pair) *))
 
-(not-pair? (procedure not-pair? (*) boolean)
+(not-pair? (#(procedure #:clean) not-pair? (*) boolean)
 	   ((pair) (let ((#(tmp) #(1))) '#f))
 	   (((not (or pair list))) (let ((#(tmp) #(1))) '#t)))
 
-(null-list? (#(procedure #:enforce) null-list? (list) boolean)
+(null-list? (#(procedure #:clean #:enforce) null-list? (list) boolean)
 	    ((pair) (let ((#(tmp) #(1))) '#f))
 	    ((list) (let ((#(tmp) #(1))) '#f))
 	    ((null) (let ((#(tmp) #(1))) '#t)))
@@ -1838,7 +1847,7 @@
 (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))))
 
-(proper-list? (procedure proper-list? (*) boolean)
+(proper-list? (#(procedure #:clean) proper-list? (*) boolean)
 	      ((null) (let ((#(tmp) #(1))) '#t)))
 
 (reduce (#(procedure #:enforce) reduce ((procedure (* *) *) * list) *)) ;XXX
@@ -1847,11 +1856,11 @@
 (remove! (forall (a) (#(procedure #:enforce) remove! ((procedure (a) *) (list a)) (list a))))
 (reverse! (forall (a) (#(procedure #:enforce) reverse! ((list a)) (list a))))
 
-(second (forall (a) (#(procedure #:enforce) second ((pair * (pair a *))) 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 #:enforce) seventh (pair) *))
-(sixth (#(procedure #:enforce) sixth (pair) *))
+(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))))
@@ -1861,32 +1870,32 @@
 (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))))
-(tenth (#(procedure #:enforce) tenth (pair) *))
+(tenth (#(procedure #:clean #:enforce) tenth (pair) *))
 
-(third (forall (a) (#(procedure #:enforce) third ((pair * (pair * (pair a *)))) a))
+(third (forall (a) (#(procedure #:clean #:enforce) third ((pair * (pair * (pair a *)))) a))
        (((pair * (pair * (pair * *))))
 	(##core#inline "C_u_i_car" 
 		       (##core#inline "C_u_i_cdr" (##core#inline "C_u_i_cdr" #(1))))))
 
 (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 #:enforce) unzip1 ((list (pair a *))) (list a))))
-(unzip2 (forall (a b) (#(procedure #:enforce) unzip2 ((list (pair a (pair b *)))) (list a) (list b))))
+(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))))
 
 (unzip3
- (forall (a b c) (#(procedure #:enforce) unzip3 ((list (pair a (pair b (pair c *))))) (list a) (list b) (list c))))
+ (forall (a b c) (#(procedure #:clean #:enforce) unzip3 ((list (pair a (pair b (pair c *))))) (list a) (list b) (list c))))
 
-(unzip4 (#(procedure #:enforce) unzip4 (list) list list list list)) ; yeah
-(unzip5 (#(procedure #:enforce) unzip5 (list) list list list list list)) ; yeah, too
-(xcons (forall (a b) (procedure xcons (a b) (pair b a))))
-(zip (forall (a) (#(procedure #:enforce) zip ((list a) #!rest list) (list (pair a *)))))
+(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 *)))))
 
 
 ;; srfi-13
 
-(check-substring-spec (#(procedure #:enforce) check-substring-spec (* string fixnum fixnum) undefined))
+(check-substring-spec (#(procedure #:clean #:enforce) check-substring-spec (* string fixnum fixnum) undefined))
 (kmp-step (#(procedure #:enforce) kmp-step (string vector char fixnum (procedure (char char) *) fixnum) fixnum))
-(make-kmp-restart-vector (#(procedure #:enforce) make-kmp-restart-vector (string #!optional (procedure (* *) *) fixnum fixnum) vector))
+(make-kmp-restart-vector (#(procedure #:clean #:enforce) make-kmp-restart-vector (string #!optional (procedure (* *) *) fixnum fixnum) vector))
 
 (string-any
  (#(procedure #:enforce)
@@ -1894,43 +1903,43 @@
   ((or char (struct char-set) (procedure (char) *)) string #!optional fixnum fixnum)
   boolean))
 
-(string-append/shared (#(procedure #:enforce) string-append/shared (#!rest string) string)
+(string-append/shared (#(procedure #:clean #:enforce) string-append/shared (#!rest string) string)
 		      ((string string) (##sys#string-append #(1) #(2))))
 
-(string-ci< (#(procedure #:enforce) string-ci< (string string #!optional fixnum fixnum) boolean)
+(string-ci< (#(procedure #:clean #:enforce) string-ci< (string string #!optional fixnum fixnum) boolean)
 	    ((string string) (string-ci<? #(1) #(2))))
 
-(string-ci<= (#(procedure #:enforce) string-ci<= (string string #!optional fixnum fixnum) boolean)
+(string-ci<= (#(procedure #:clean #:enforce) string-ci<= (string string #!optional fixnum fixnum) boolean)
 	     ((string string) (string-ci<=? #(1) #(2))))
 
-(string-ci<> (#(procedure #:enforce) string-ci<> (string string #!optional fixnum fixnum) boolean)
+(string-ci<> (#(procedure #:clean #:enforce) string-ci<> (string string #!optional fixnum fixnum) boolean)
 	     ((string string) (not (##core#inline "C_i_string_ci_equal_p" #(1) #(2)))))
 
-(string-ci= (#(procedure #:enforce) string-ci= (string string #!optional fixnum fixnum) boolean)
+(string-ci= (#(procedure #:clean #:enforce) string-ci= (string string #!optional fixnum fixnum) boolean)
 	    ((string string) (##core#inline "C_i_string_ci_equal_p" #(1) #(2))))
 
-(string-ci> (#(procedure #:enforce) string-ci> (string string #!optional fixnum fixnum) boolean)
+(string-ci> (#(procedure #:clean #:enforce) string-ci> (string string #!optional fixnum fixnum) boolean)
 	    ((string string) (string-ci>? #(1) #(2))))
 
-(string-ci>= (#(procedure #:enforce) string-ci>= (string string #!optional fixnum fixnum) boolean)
+(string-ci>= (#(procedure #:clean #:enforce) string-ci>= (string string #!optional fixnum fixnum) boolean)
 	     ((string string) (string-ci>=? #(1) #(2))))
 
 (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 #:enforce) string-concatenate ((list string)) string))
-(string-concatenate-reverse (#(procedure #:enforce) string-concatenate-reverse ((list string) #!optional string fixnum) string))
-(string-concatenate-reverse/shared (#(procedure #:enforce) string-concatenate-reverse/shared ((list string) #!optional string fixnum) string))
-(string-concatenate/shared (#(procedure #:enforce) string-concatenate/shared ((list string)) string))
-(string-contains (#(procedure #:enforce) string-contains (string string #!optional fixnum fixnum fixnum fixnum) (or fixnum boolean)))
-(string-contains-ci (#(procedure #:enforce) string-contains-ci (string string #!optional fixnum fixnum fixnum fixnum) (or fixnum boolean)))
-(string-copy (#(procedure #:enforce) string-copy (string #!optional fixnum fixnum) string))
-(string-copy! (#(procedure #:enforce) string-copy! (string fixnum string #!optional fixnum fixnum) undefined))
-(string-count (#(procedure #:enforce) string-count (string * #!optional fixnum fixnum) fixnum))
-(string-delete (#(procedure #:enforce) string-delete (* string #!optional fixnum fixnum) string))
-(string-downcase (#(procedure #:enforce) string-downcase (string #!optional fixnum fixnum) string))
-(string-downcase! (#(procedure #:enforce) string-downcase! (string #!optional fixnum fixnum) string))
-(string-drop (#(procedure #:enforce) string-drop (string fixnum) string))
-(string-drop-right (#(procedure #:enforce) string-drop-right (string fixnum) string))
+(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-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))
+(string-copy! (#(procedure #:clean #:enforce) string-copy! (string fixnum string #!optional fixnum fixnum) undefined))
+(string-count (#(procedure #:clean #:enforce) string-count (string * #!optional fixnum fixnum) fixnum))
+(string-delete (#(procedure #:clean #:enforce) string-delete (* string #!optional fixnum fixnum) string))
+(string-downcase (#(procedure #:clean #:enforce) string-downcase (string #!optional fixnum fixnum) string))
+(string-downcase! (#(procedure #:clean #:enforce) string-downcase! (string #!optional fixnum fixnum) string))
+(string-drop (#(procedure #:clean #:enforce) string-drop (string fixnum) string))
+(string-drop-right (#(procedure #:clean #:enforce) string-drop-right (string fixnum) string))
 
 (string-every
  (#(procedure #:enforce)
@@ -1938,7 +1947,7 @@
   ((or char (struct char-set) (procedure (char) *)) string #!optional fixnum fixnum) 
   boolean))
 
-(string-fill! (#(procedure #:enforce) string-fill! (string char #!optional fixnum fixnum) string))
+(string-fill! (#(procedure #:clean #:enforce) string-fill! (string char #!optional fixnum fixnum) string))
 
 (string-filter
  (#(procedure #:enforce) 
@@ -1964,25 +1973,25 @@
   (string (or char (struct char-set) (procedure (char) *)) #!optional fixnum fixnum)
   (or fixnum boolean)))
 
-(string-join (#(procedure #:enforce) string-join (list #!optional string symbol) string))
+(string-join (#(procedure #:clean #:enforce) string-join (list #!optional string symbol) string))
 (string-kmp-partial-search (#(procedure #:enforce) string-kmp-partial-search (string vector string fixnum #!optional (procedure (char char) *) fixnum fixnum fixnum) fixnum))
 (string-map (#(procedure #:enforce) string-map ((procedure (char) char) string #!optional fixnum fixnum) string))
 (string-map! (#(procedure #:enforce) string-map! ((procedure (char) char) string #!optional fixnum fixnum) string))
 
-(string-null? (#(procedure #:enforce) string-null? (string) boolean)
+(string-null? (#(procedure #:clean #:enforce) string-null? (string) boolean)
 	      ((string) (##core#inline "C_zero_length_p" #(1))))
 
-(string-pad (#(procedure #:enforce) string-pad (string fixnum #!optional char fixnum fixnum) string))
-(string-pad-right (#(procedure #:enforce) string-pad-right (string fixnum #!optional char fixnum fixnum) string))
+(string-pad (#(procedure #:clean #:enforce) string-pad (string fixnum #!optional char fixnum fixnum) string))
+(string-pad-right (#(procedure #:clean #:enforce) string-pad-right (string fixnum #!optional char fixnum fixnum) string))
 (string-parse-final-start+end (#(procedure #:enforce) string-parse-final-start+end (procedure string #!rest) . *))
 (string-parse-start+end (#(procedure #:enforce) string-parse-start+end (procedure string #!rest) . *))
-(string-prefix-ci? (#(procedure #:enforce) string-prefix-ci? (string string #!optional fixnum fixnum fixnum fixnum) boolean))
-(string-prefix-length (#(procedure #:enforce) string-prefix-length (string string #!optional fixnum fixnum fixnum fixnum) fixnum))
-(string-prefix-length-ci (#(procedure #:enforce) string-prefix-length-ci (string string #!optional fixnum fixnum fixnum fixnum) fixnum))
-(string-prefix? (#(procedure #:enforce) string-prefix? (string string #!optional fixnum fixnum fixnum fixnum) boolean))
-(string-replace (#(procedure #:enforce) string-replace (string string fixnum fixnum #!optional fixnum fixnum) string))
-(string-reverse (#(procedure #:enforce) string-reverse (string #!optional fixnum fixnum) string))
-(string-reverse! (#(procedure #:enforce) string-reverse! (string #!optional fixnum fixnum) string))
+(string-prefix-ci? (#(procedure #:clean #:enforce) string-prefix-ci? (string string #!optional fixnum fixnum fixnum fixnum) boolean))
+(string-prefix-length (#(procedure #:clean #:enforce) string-prefix-length (string string #!optional fixnum fixnum fixnum fixnum) fixnum))
+(string-prefix-length-ci (#(procedure #:clean #:enforce) string-prefix-length-ci (string string #!optional fixnum fixnum fixnum fixnum) fixnum))
+(string-prefix? (#(procedure #:clean #:enforce) string-prefix? (string string #!optional fixnum fixnum fixnum fixnum) boolean))
+(string-replace (#(procedure #:clean #:enforce) string-replace (string string fixnum fixnum #!optional fixnum fixnum) string))
+(string-reverse (#(procedure #:clean #:enforce) string-reverse (string #!optional fixnum fixnum) string))
+(string-reverse! (#(procedure #:clean #:enforce) string-reverse! (string #!optional fixnum fixnum) string))
 
 (string-skip
  (#(procedure #:enforce) 
@@ -1996,21 +2005,21 @@
   (string (or char (struct char-set) (procedure (char) *)) #!optional fixnum fixnum)
   (or fixnum boolean)))
 
-(string-suffix-ci? (#(procedure #:enforce) string-suffix-ci? (string string #!optional fixnum fixnum fixnum fixnum) boolean))
-(string-suffix-length (#(procedure #:enforce) string-suffix-length (string string #!optional fixnum fixnum fixnum fixnum) fixnum))
-(string-suffix-length-ci (#(procedure #:enforce) string-suffix-length-ci (string string #!optional fixnum fixnum fixnum fixnum) fixnum))
-(string-suffix? (#(procedure #:enforce) string-suffix? (string string #!optional fixnum fixnum fixnum fixnum) boolean))
+(string-suffix-ci? (#(procedure #:clean #:enforce) string-suffix-ci? (string string #!optional fixnum fixnum fixnum fixnum) boolean))
+(string-suffix-length (#(procedure #:clean #:enforce) string-suffix-length (string string #!optional fixnum fixnum fixnum fixnum) fixnum))
+(string-suffix-length-ci (#(procedure #:clean #:enforce) string-suffix-length-ci (string string #!optional fixnum fixnum fixnum fixnum) fixnum))
+(string-suffix? (#(procedure #:clean #:enforce) string-suffix? (string string #!optional fixnum fixnum fixnum fixnum) boolean))
 (string-tabulate (#(procedure #:enforce) string-tabulate ((procedure (fixnum) char) fixnum) string))
-(string-take (#(procedure #:enforce) string-take (string fixnum) string))
-(string-take-right (#(procedure #:enforce) string-take-right (string fixnum) string))
-(string-titlecase (#(procedure #:enforce) string-titlecase (string #!optional fixnum fixnum) string))
-(string-titlecase! (#(procedure #:enforce) string-titlecase! (string #!optional fixnum fixnum) string))
+(string-take (#(procedure #:clean #:enforce) string-take (string fixnum) string))
+(string-take-right (#(procedure #:clean #:enforce) string-take-right (string fixnum) string))
+(string-titlecase (#(procedure #:clean #:enforce) string-titlecase (string #!optional fixnum fixnum) string))
+(string-titlecase! (#(procedure #:clean #:enforce) string-titlecase! (string #!optional fixnum fixnum) string))
 
 (string-tokenize
- (#(procedure #:enforce) string-tokenize (string #!optional (struct char-set) fixnum fixnum) list))
+ (#(procedure #:clean #:enforce) string-tokenize (string #!optional (struct char-set) fixnum fixnum) list))
 
 (string-trim
- (#(procedure #:enforce) 
+ (#(procedure #:enforce)
   string-trim
   (string #!optional (or char (struct char-set) (procedure (char) *)) fixnum fixnum) 
   string))
@@ -2029,31 +2038,31 @@
 
 (string-unfold (#(procedure #:enforce) string-unfold (procedure procedure procedure * #!optional * procedure) string)) ;XXX
 (string-unfold-right (#(procedure #:enforce) string-unfold-right (procedure procedure procedure * #!optional * procedure) string)) ;XXX
-(string-upcase (#(procedure #:enforce) string-upcase (string #!optional fixnum fixnum) string))
-(string-upcase! (#(procedure #:enforce) string-upcase! (string #!optional fixnum fixnum) string))
-(string-xcopy! (#(procedure #:enforce) string-xcopy! (string string string fixnum #!optional fixnum fixnum fixnum) string))
+(string-upcase (#(procedure #:clean #:enforce) string-upcase (string #!optional fixnum fixnum) string))
+(string-upcase! (#(procedure #:clean #:enforce) string-upcase! (string #!optional fixnum fixnum) string))
+(string-xcopy! (#(procedure #:clean #:enforce) string-xcopy! (string string string fixnum #!optional fixnum fixnum fixnum) string))
 
-(string< (#(procedure #:enforce) string< (string string #!optional fixnum fixnum fixnum fixnum) boolean)
+(string< (#(procedure #:clean #:enforce) string< (string string #!optional fixnum fixnum fixnum fixnum) boolean)
 	 ((string string) (string<? #(1) #(2))))
 
-(string<= (#(procedure #:enforce) string<= (string string #!optional fixnum fixnum fixnum fixnum) boolean)
+(string<= (#(procedure #:clean #:enforce) string<= (string string #!optional fixnum fixnum fixnum fixnum) boolean)
 	  ((string string) (string<=? #(1) #(2))))
 
-(string<> (#(procedure #:enforce) string<> (string string #!optional fixnum fixnum fixnum fixnum) boolean)
+(string<> (#(procedure #:clean #:enforce) string<> (string string #!optional fixnum fixnum fixnum fixnum) boolean)
 	  ((string string) (not (##core#inline "C_i_string_equal_p" #(1) #(2)))))
 
-(string= (#(procedure #:enforce) string= (string string #!optional fixnum fixnum fixnum fixnum) boolean)
+(string= (#(procedure #:clean #:enforce) string= (string string #!optional fixnum fixnum fixnum fixnum) boolean)
 	 ((string string) (##core#inline "C_i_string_equal_p" #(1) #(2))))
 
-(string> (#(procedure #:enforce) string> (string string #!optional fixnum fixnum fixnum fixnum) boolean)
+(string> (#(procedure #:clean #:enforce) string> (string string #!optional fixnum fixnum fixnum fixnum) boolean)
 	 ((string string) (string>? #(1) #(2))))
 
-(string>= (#(procedure #:enforce) string>= (string string #!optional fixnum fixnum fixnum fixnum) boolean)
+(string>= (#(procedure #:clean #:enforce) string>= (string string #!optional fixnum fixnum fixnum fixnum) boolean)
 	  ((string string) (string>=? #(1) #(2))))
 
-(substring-spec-ok? (#(procedure #:enforce) substring-spec-ok? (string fixnum fixnum) boolean))
-(substring/shared (#(procedure #:enforce) substring/shared (string fixnum #!optional fixnum) string))
-(xsubstring (#(procedure #:enforce) xsubstring (string fixnum #!optional fixnum fixnum fixnum) string))
+(substring-spec-ok? (#(procedure #:clean #:enforce) substring-spec-ok? (string fixnum fixnum) boolean))
+(substring/shared (#(procedure #:clean #:enforce) substring/shared (string fixnum #!optional fixnum) string))
+(xsubstring (#(procedure #:clean #:enforce) xsubstring (string fixnum #!optional fixnum fixnum fixnum) string))
 
 
 ;; srfi-14
@@ -2064,41 +2073,41 @@
 	    ((char) (char-set #(1))))
 
 (char-set (#(procedure #:enforce) char-set (#!rest char) (struct char-set)))
-(char-set->list (#(procedure #:enforce) char-set->list ((struct char-set)) list))
-(char-set->string (#(procedure #:enforce) char-set->string ((struct char-set)) string))
-(char-set-adjoin (#(procedure #:enforce) char-set-adjoin ((struct char-set) #!rest char) (struct char-set)))
-(char-set-adjoin! (#(procedure #:enforce) char-set-adjoin! ((struct char-set) #!rest char) (struct char-set)))
+(char-set->list (#(procedure #:clean #:enforce) char-set->list ((struct char-set)) list))
+(char-set->string (#(procedure #:clean #:enforce) char-set->string ((struct char-set)) string))
+(char-set-adjoin (#(procedure #:clean #:enforce) char-set-adjoin ((struct char-set) #!rest char) (struct char-set)))
+(char-set-adjoin! (#(procedure #:clean #:enforce) char-set-adjoin! ((struct char-set) #!rest char) (struct char-set)))
 (char-set-any (#(procedure #:enforce) char-set-any ((procedure (char) *) (struct char-set)) *))
-(char-set-complement (#(procedure #:enforce) char-set-complement ((struct char-set)) (struct char-set)))
-(char-set-complement! (#(procedure #:enforce) char-set-complement! ((struct char-set)) (struct char-set)))
-(char-set-contains? (#(procedure #:enforce) char-set-contains? ((struct char-set) char) boolean))
-(char-set-copy (#(procedure #:enforce) char-set-copy ((struct char-set)) (struct char-set)))
-(char-set-count (#(procedure #:enforce) char-set-count ((procedure (char) *) (struct char-set)) fixnum))
-(char-set-cursor (#(procedure #:enforce) char-set-cursor ((struct char-set)) fixnum))
-(char-set-cursor-next (#(procedure #:enforce) char-set-cursor-next ((struct char-set) fixnum) fixnum))
-(char-set-delete (#(procedure #:enforce) char-set-delete ((struct char-set) #!rest char) (struct char-set)))
-(char-set-delete! (#(procedure #:enforce) char-set-delete! ((struct char-set) #!rest char) (struct char-set)))
-(char-set-diff+intersection (#(procedure #:enforce) char-set-diff+intersection ((struct char-set) #!rest (struct char-set)) (struct char-set) (struct char-set)))
-(char-set-diff+intersection! (#(procedure #:enforce) char-set-diff+intersection! ((struct char-set) #!rest (struct char-set)) (struct char-set) (struct char-set)))
-(char-set-difference (#(procedure #:enforce) char-set-difference ((struct char-set) #!rest (struct char-set)) (struct char-set)))
-(char-set-difference! (#(procedure #:enforce) char-set-difference! ((struct char-set) #!rest (struct char-set)) (struct char-set)))
+(char-set-complement (#(procedure #:clean #:enforce) char-set-complement ((struct char-set)) (struct char-set)))
+(char-set-complement! (#(procedure #:clean #:enforce) char-set-complement! ((struct char-set)) (struct char-set)))
+(char-set-contains? (#(procedure #:clean #:enforce) char-set-contains? ((struct char-set) char) boolean))
+(char-set-copy (#(procedure #:clean #:enforce) char-set-copy ((struct char-set)) (struct char-set)))
+(char-set-count (#(procedure #:clean #:enforce) char-set-count ((procedure (char) *) (struct char-set)) fixnum))
+(char-set-cursor (#(procedure #:clean #:enforce) char-set-cursor ((struct char-set)) fixnum))
+(char-set-cursor-next (#(procedure #:clean #:enforce) char-set-cursor-next ((struct char-set) fixnum) fixnum))
+(char-set-delete (#(procedure #:clean #:enforce) char-set-delete ((struct char-set) #!rest char) (struct char-set)))
+(char-set-delete! (#(procedure #:clean #:enforce) char-set-delete! ((struct char-set) #!rest char) (struct char-set)))
+(char-set-diff+intersection (#(procedure #:clean #:enforce) char-set-diff+intersection ((struct char-set) #!rest (struct char-set)) (struct char-set) (struct char-set)))
+(char-set-diff+intersection! (#(procedure #:clean #:enforce) char-set-diff+intersection! ((struct char-set) #!rest (struct char-set)) (struct char-set) (struct char-set)))
+(char-set-difference (#(procedure #:clean #:enforce) char-set-difference ((struct char-set) #!rest (struct char-set)) (struct char-set)))
+(char-set-difference! (#(procedure #:clean #:enforce) char-set-difference! ((struct char-set) #!rest (struct char-set)) (struct char-set)))
 (char-set-every (#(procedure #:enforce) char-set-every ((procedure (char) *) (struct char-set)) boolean))
 (char-set-filter (#(procedure #:enforce) char-set-filter ((procedure (char) *) (struct char-set) #!optional (struct char-set)) (struct char-set)))
 (char-set-filter! (#(procedure #:enforce) char-set-filter! ((procedure (char) *) (struct char-set) #!optional (struct char-set)) (struct char-set)))
 (char-set-fold (#(procedure #:enforce) char-set-fold ((procedure (char *) *) * (struct char-set)) *))
 (char-set-for-each (#(procedure #:enforce) char-set-for-each ((procedure (char) . *) (struct char-set)) undefined))
-(char-set-hash (#(procedure #:enforce) char-set-hash ((struct char-set) #!optional number) number))
-(char-set-intersection (#(procedure #:enforce) char-set-intersection (#!rest (struct char-set)) (struct char-set)))
-(char-set-intersection! (#(procedure #:enforce) char-set-intersection! (#!rest (struct char-set)) (struct char-set)))
+(char-set-hash (#(procedure #:clean #:enforce) char-set-hash ((struct char-set) #!optional number) number))
+(char-set-intersection (#(procedure #:clean #:enforce) char-set-intersection (#!rest (struct char-set)) (struct char-set)))
+(char-set-intersection! (#(procedure #:clean #:enforce) char-set-intersection! (#!rest (struct char-set)) (struct char-set)))
 (char-set-map (#(procedure #:enforce) char-set-map ((procedure (char) char) (struct char-set)) (struct char-set)))
-(char-set-ref (#(procedure #:enforce) char-set-ref ((struct char-set) fixnum) char))
-(char-set-size (#(procedure #:enforce) char-set-size ((struct char-set)) fixnum))
+(char-set-ref (#(procedure #:clean #:enforce) char-set-ref ((struct char-set) fixnum) char))
+(char-set-size (#(procedure #:clean #:enforce) char-set-size ((struct char-set)) fixnum))
 (char-set-unfold (#(procedure #:enforce) char-set-unfold (procedure procedure procedure * #!optional (struct char-set)) (struct char-set)))
 (char-set-unfold! (#(procedure #:enforce) char-set-unfold! (procedure procedure procedure * (struct char-set)) (struct char-set)))
-(char-set-union (#(procedure #:enforce) char-set-union (#!rest (struct char-set)) (struct char-set)))
-(char-set-union! (#(procedure #:enforce) char-set-union! (#!rest (struct char-set)) (struct char-set)))
-(char-set-xor (#(procedure #:enforce) char-set-xor (#!rest (struct char-set)) (struct char-set)))
-(char-set-xor! (#(procedure #:enforce) char-set-xor! (#!rest (struct char-set)) (struct char-set)))
+(char-set-union (#(procedure #:clean #:enforce) char-set-union (#!rest (struct char-set)) (struct char-set)))
+(char-set-union! (#(procedure #:clean #:enforce) char-set-union! (#!rest (struct char-set)) (struct char-set)))
+(char-set-xor (#(procedure #:clean #:enforce) char-set-xor (#!rest (struct char-set)) (struct char-set)))
+(char-set-xor! (#(procedure #:clean #:enforce) char-set-xor! (#!rest (struct char-set)) (struct char-set)))
 (char-set:ascii (struct char-set))
 (char-set:blank (struct char-set))
 (char-set:digit (struct char-set))
@@ -2116,345 +2125,345 @@
 (char-set:title-case (struct char-set))
 (char-set:upper-case (struct char-set))
 (char-set:whitespace (struct char-set))
-(char-set<= (#(procedure #:enforce) char-set<= (#!rest (struct char-set)) boolean))
-(char-set= (#(procedure #:enforce) char-set= (#!rest (struct char-set)) boolean))
+(char-set<= (#(procedure #:clean #:enforce) char-set<= (#!rest (struct char-set)) boolean))
+(char-set= (#(procedure #:clean #:enforce) char-set= (#!rest (struct char-set)) boolean))
 
-(char-set? (#(procedure #:predicate (struct char-set)) char-set? (*) boolean))
+(char-set? (#(procedure #:pure #:predicate (struct char-set)) char-set? (*) boolean))
 
-(end-of-char-set? (#(procedure #:enforce) end-of-char-set? (fixnum) boolean))
-(list->char-set (#(procedure #:enforce) list->char-set (list #!optional (struct char-set)) (struct char-set)))
-(list->char-set! (#(procedure #:enforce) list->char-set! (list #!optional (struct char-set)) (struct char-set)))
-(string->char-set (#(procedure #:enforce) string->char-set (string #!optional (struct char-set)) (struct char-set)))
-(string->char-set! (#(procedure #:enforce) string->char-set! (string #!optional (struct char-set)) (struct char-set)))
-(ucs-range->char-set (#(procedure #:enforce) ucs-range->char-set (fixnum fixnum #!optional * (struct char-set)) (struct char-set)))
-(ucs-range->char-set! (#(procedure #:enforce) ucs-range->char-set! (fixnum fixnum #!optional * (struct char-set)) (struct char-set)))
+(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)))
+(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)))
+(ucs-range->char-set! (#(procedure #:clean #:enforce) ucs-range->char-set! (fixnum fixnum #!optional * (struct char-set)) (struct char-set)))
 
 
 ;; srfi-18
 
-(abandoned-mutex-exception? (procedure abandoned-mutex-exception? (*) boolean))
-(condition-variable-broadcast! (#(procedure #:enforce) condition-variable-broadcast! ((struct condition-variable)) undefined))
-(condition-variable-name (#(procedure #:enforce) condition-variable-name ((struct condition-variable)) *))
-(condition-variable-signal! (#(procedure #:enforce) condition-variable-signal! ((struct condition-variable)) undefined))
-(condition-variable-specific (#(procedure #:enforce) condition-variable-specific ((struct condition-variable)) *))
-(condition-variable-specific-set! (#(procedure #:enforce) condition-variable-specific-set! ((struct condition-variable) *) undefined))
+(abandoned-mutex-exception? (#(procedure #:pure) abandoned-mutex-exception? (*) boolean))
+(condition-variable-broadcast! (#(procedure #:clean #:enforce) condition-variable-broadcast! ((struct condition-variable)) undefined))
+(condition-variable-name (#(procedure #:clean #:enforce) condition-variable-name ((struct condition-variable)) *))
+(condition-variable-signal! (#(procedure #:clean #:enforce) condition-variable-signal! ((struct condition-variable)) undefined))
+(condition-variable-specific (#(procedure #:clean #:enforce) condition-variable-specific ((struct condition-variable)) *))
+(condition-variable-specific-set! (#(procedure #:clean #:enforce) condition-variable-specific-set! ((struct condition-variable) *) undefined))
 
-(condition-variable? (#(procedure #:predicate (struct condition-variable))
+(condition-variable? (#(procedure #:pure #:predicate (struct condition-variable))
 		      condition-variable? (*) 
 		      boolean))
 
-(current-thread (procedure current-thread () (struct thread))) ;XXX
+(current-thread (#(procedure #:clean) current-thread () (struct thread))) ;XXX
 
-(current-time (procedure current-time () (struct time)))
-(join-timeout-exception? (procedure join-timeout-exception? (*) boolean))
-(make-condition-variable (procedure make-condition-variable (#!optional *) (struct condition-variable)))
-(make-mutex (procedure make-mutex (#!optional *) (struct mutex)))
-(make-thread (#(procedure #:enforce) make-thread ((procedure () . *) #!optional *) (struct thread)))
+(current-time (#(procedure #:clean) current-time () (struct time)))
+(join-timeout-exception? (#(procedure #:pure) join-timeout-exception? (*) boolean))
+(make-condition-variable (#(procedure #:clean) make-condition-variable (#!optional *) (struct condition-variable)))
+(make-mutex (#(procedure #:clean) make-mutex (#!optional *) (struct mutex)))
+(make-thread (#(procedure #:clean #:enforce) make-thread ((procedure () . *) #!optional *) (struct thread)))
 (milliseconds->time deprecated)
-(mutex-lock! (#(procedure #:enforce) mutex-lock! ((struct mutex) #!optional * (struct thread)) boolean))
+(mutex-lock! (#(procedure #:clean #:enforce) mutex-lock! ((struct mutex) #!optional * (struct thread)) boolean))
 
-(mutex-name (#(procedure #:enforce) mutex-name ((struct mutex)) *)
+(mutex-name (#(procedure #:clean #:enforce) mutex-name ((struct mutex)) *)
 	    (((struct mutex)) (##sys#slot #(1) '1)))
 
-(mutex-specific (#(procedure #:enforce) mutex-specific ((struct mutex)) *)
+(mutex-specific (#(procedure #:clean #:enforce) mutex-specific ((struct mutex)) *)
 		(((struct mutex)) (##sys#slot #(1) '6)))
 
-(mutex-specific-set! (#(procedure #:enforce) mutex-specific-set! ((struct mutex) *) undefined)
+(mutex-specific-set! (#(procedure #:clean #:enforce) mutex-specific-set! ((struct mutex) *) undefined)
 		     (((struct mutex) *) (##sys#setslot #(1) '6 #(2))))
 
-(mutex-state (#(procedure #:enforce) mutex-state ((struct mutex)) symbol))
-(mutex-unlock! (#(procedure #:enforce) mutex-unlock! ((struct mutex) #!optional (struct condition-variable) *) undefined))
+(mutex-state (#(procedure #:clean #:enforce) mutex-state ((struct mutex)) symbol))
+(mutex-unlock! (#(procedure #:clean #:enforce) mutex-unlock! ((struct mutex) #!optional (struct condition-variable) *) undefined))
 
-(mutex? (#(procedure #:predicate (struct mutex)) mutex? (*) boolean))
+(mutex? (#(procedure #:pure #:predicate (struct mutex)) mutex? (*) boolean))
 
 (raise (procedure raise (*) noreturn))
-(seconds->time (#(procedure #:enforce) seconds->time (number) (struct time)))
-(terminated-thread-exception? (procedure terminated-thread-exception? (*) boolean))
-(thread-join! (#(procedure #:enforce) thread-join! ((struct thread) #!optional * *) *))
+(seconds->time (#(procedure #:clean #:enforce) seconds->time (number) (struct time)))
+(terminated-thread-exception? (#(procedure #:pure) terminated-thread-exception? (*) boolean))
+(thread-join! (#(procedure #:clean #:enforce) thread-join! ((struct thread) #!optional * *) *))
 
-(thread-name (#(procedure #:enforce) thread-name ((struct thread)) *)
+(thread-name (#(procedure #:clean #:enforce) thread-name ((struct thread)) *)
 	     (((struct thread)) (##sys#slot #(1) '6)))
 
-(thread-quantum (#(procedure #:enforce) thread-quantum ((struct thread)) fixnum)
+(thread-quantum (#(procedure #:clean #:enforce) thread-quantum ((struct thread)) fixnum)
 		(((struct thread)) (##sys#slot #(1) '9)))
 
-(thread-quantum-set! (#(procedure #:enforce) thread-quantum-set! ((struct thread) fixnum) undefined))
-(thread-resume! (#(procedure #:enforce) thread-resume! ((struct thread)) undefined))
-(thread-signal! (#(procedure #:enforce) thread-signal! ((struct thread) *) undefined))
-(thread-sleep! (procedure thread-sleep! (*) undefined))
+(thread-quantum-set! (#(procedure #:clean #:enforce) thread-quantum-set! ((struct thread) fixnum) undefined))
+(thread-resume! (#(procedure #:clean #:enforce) thread-resume! ((struct thread)) undefined))
+(thread-signal! (#(procedure #:clean #:enforce) thread-signal! ((struct thread) *) undefined))
+(thread-sleep! (#(procedure #:clean) thread-sleep! (*) undefined))
 
-(thread-specific (#(procedure #:enforce) thread-specific ((struct thread)) *)
+(thread-specific (#(procedure #:clean #:enforce) thread-specific ((struct thread)) *)
 		 (((struct thread)) (##sys#slot #(1) '10)))
 
-(thread-specific-set! (#(procedure #:enforce) thread-specific-set! ((struct thread) *) undefined)
+(thread-specific-set! (#(procedure #:clean #:enforce) thread-specific-set! ((struct thread) *) undefined)
 		      (((struct thread) *) (##sys#setslot #(1) '10 #(2))))
 
 (thread-start! (#(procedure #:enforce) thread-start! ((or (struct thread) (procedure () . *))) (struct thread)))
 
-(thread-state (#(procedure #:enforce) thread-state ((struct thread)) symbol)
+(thread-state (#(procedure #:clean #:enforce) thread-state ((struct thread)) symbol)
 	      (((struct thread)) (##sys#slot #(1) '3)))
 
-(thread-suspend! (#(procedure #:enforce) thread-suspend! ((struct thread)) undefined))
-(thread-terminate! (#(procedure #:enforce) thread-terminate! ((struct thread)) undefined))
-(thread-wait-for-i/o! (#(procedure #:enforce) thread-wait-for-i/o! (fixnum #!optional symbol) undefined))
-(thread-yield! (procedure thread-yield! () undefined))
+(thread-suspend! (#(procedure #:clean #:enforce) thread-suspend! ((struct thread)) undefined))
+(thread-terminate! (#(procedure #:clean #:enforce) thread-terminate! ((struct thread)) undefined))
+(thread-wait-for-i/o! (#(procedure #:clean #:enforce) thread-wait-for-i/o! (fixnum #!optional symbol) undefined))
+(thread-yield! (#(procedure #:clean) thread-yield! () undefined))
 
-(thread? (#(procedure #:predicate (struct thread)) thread? (*) boolean))
+(thread? (#(procedure #:pure #:predicate (struct thread)) thread? (*) boolean))
 
 (time->milliseconds deprecated)
-(time->seconds (#(procedure #:enforce) time->seconds ((struct time)) number))
+(time->seconds (#(procedure #:clean #:enforce) time->seconds ((struct time)) number))
 
-(time? (#(procedure #:predicate (struct time)) time? (*) boolean))
+(time? (#(procedure #:pure #:predicate (struct time)) time? (*) boolean))
 
-(uncaught-exception-reason (#(procedure #:enforce) uncaught-exception-reason ((struct condition)) *))
-(uncaught-exception? (procedure uncaught-exception? (*) boolean))
+(uncaught-exception-reason (#(procedure #:clean #:enforce) uncaught-exception-reason ((struct condition)) *))
+(uncaught-exception? (#(procedure #:pure) uncaught-exception? (*) boolean))
 
 
 ;; srfi-4
 
-(blob->f32vector (#(procedure #:enforce) blob->f32vector (blob) (struct f32vector)))
-(blob->f32vector/shared (#(procedure #:enforce) blob->f32vector/shared (blob) (struct f32vector)))
-(blob->f64vector (#(procedure #:enforce) blob->f64vector (blob) (struct f64vector)))
-(blob->f64vector/shared (#(procedure #:enforce) blob->f64vector/shared (blob) (struct f64vector)))
-(blob->s16vector (#(procedure #:enforce) blob->s16vector (blob) (struct s16vector)))
-(blob->s16vector/shared (#(procedure #:enforce) blob->s16vector/shared (blob) (struct s16vector)))
-(blob->s32vector (#(procedure #:enforce) blob->s32vector (blob) (struct s32vector)))
-(blob->s32vector/shared (#(procedure #:enforce) blob->s32vector/shared (blob) (struct s32vector)))
-(blob->s8vector (#(procedure #:enforce) blob->s8vector (blob) (struct u8vector)))
-(blob->s8vector/shared (#(procedure #:enforce) blob->s8vector/shared (blob) (struct u8vector)))
-(blob->u16vector (#(procedure #:enforce) blob->u16vector (blob) (struct u16vector)))
-(blob->u16vector/shared (#(procedure #:enforce) blob->u16vector/shared (blob) (struct u16vector)))
-(blob->u32vector (#(procedure #:enforce) blob->u32vector (blob) (struct u32vector)))
-(blob->u32vector/shared (#(procedure #:enforce) blob->u32vector/shared (blob) (struct u32vector)))
-(blob->u8vector (#(procedure #:enforce) blob->u8vector (blob) (struct u8vector)))
-(blob->u8vector/shared (#(procedure #:enforce) blob->u8vector/shared (blob) (struct u8vector)))
-(f32vector (#(procedure #:enforce) f32vector (#!rest number) (struct f32vector)))
-(f32vector->blob (#(procedure #:enforce) f32vector->blob ((struct f32vector)) blob))
-(f32vector->blob/shared (#(procedure #:enforce) f32vector->blob/shared ((struct f32vector)) blob))
-(f32vector->list (#(procedure #:enforce) f32vector->list ((struct f32vector)) list))
-
-(f32vector-length (#(procedure #:enforce) f32vector-length ((struct f32vector)) fixnum)
+(blob->f32vector (#(procedure #:clean #:enforce) blob->f32vector (blob) (struct f32vector)))
+(blob->f32vector/shared (#(procedure #:clean #:enforce) blob->f32vector/shared (blob) (struct f32vector)))
+(blob->f64vector (#(procedure #:clean #:enforce) blob->f64vector (blob) (struct f64vector)))
+(blob->f64vector/shared (#(procedure #:clean #:enforce) blob->f64vector/shared (blob) (struct f64vector)))
+(blob->s16vector (#(procedure #:clean #:enforce) blob->s16vector (blob) (struct s16vector)))
+(blob->s16vector/shared (#(procedure #:clean #:enforce) blob->s16vector/shared (blob) (struct s16vector)))
+(blob->s32vector (#(procedure #:clean #:enforce) blob->s32vector (blob) (struct s32vector)))
+(blob->s32vector/shared (#(procedure #:clean #:enforce) blob->s32vector/shared (blob) (struct s32vector)))
+(blob->s8vector (#(procedure #:clean #:enforce) blob->s8vector (blob) (struct u8vector)))
+(blob->s8vector/shared (#(procedure #:clean #:enforce) blob->s8vector/shared (blob) (struct u8vector)))
+(blob->u16vector (#(procedure #:clean #:enforce) blob->u16vector (blob) (struct u16vector)))
+(blob->u16vector/shared (#(procedure #:clean #:enforce) blob->u16vector/shared (blob) (struct u16vector)))
+(blob->u32vector (#(procedure #:clean #:enforce) blob->u32vector (blob) (struct u32vector)))
+(blob->u32vector/shared (#(procedure #:clean #:enforce) blob->u32vector/shared (blob) (struct u32vector)))
+(blob->u8vector (#(procedure #:clean #:enforce) blob->u8vector (blob) (struct u8vector)))
+(blob->u8vector/shared (#(procedure #:clean #:enforce) blob->u8vector/shared (blob) (struct u8vector)))
+(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))
+
+(f32vector-length (#(procedure #:clean #:enforce) f32vector-length ((struct f32vector)) fixnum)
 		  (((struct f32vector)) (##core#inline "C_u_i_32vector_length" #(1))))
 
-(f32vector-ref (#(procedure #:enforce) f32vector-ref ((struct f32vector) fixnum) float))
-(f32vector-set! (#(procedure #:enforce) f32vector-set! ((struct f32vector) fixnum number) undefined))
+(f32vector-ref (#(procedure #:clean #:enforce) f32vector-ref ((struct f32vector) fixnum) float))
+(f32vector-set! (#(procedure #:clean #:enforce) f32vector-set! ((struct f32vector) fixnum number) undefined))
 
-(f32vector? (#(procedure #:predicate (struct f32vector)) f32vector? (*) boolean))
+(f32vector? (#(procedure #:pure #:predicate (struct f32vector)) f32vector? (*) boolean))
 
-(f64vector (#(procedure #:enforce) f64vector (#!rest number) (struct f64vector)))
-(f64vector->blob (#(procedure #:enforce) f64vector->blob ((struct f32vector)) blob))
-(f64vector->blob/shared (#(procedure #:enforce) f64vector->blob/shared ((struct f64vector)) blob))
-(f64vector->list (#(procedure #:enforce) f64vector->list ((struct f64vector)) blob))
+(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)) blob))
 
-(f64vector-length (#(procedure #:enforce) f64vector-length ((struct f64vector)) fixnum)
+(f64vector-length (#(procedure #:clean #:enforce) f64vector-length ((struct f64vector)) fixnum)
 		  (((struct f32vector)) (##core#inline "C_u_i_64vector_length" #(1))))
 
-(f64vector-ref (#(procedure #:enforce) f64vector-ref ((struct f64vector) fixnum) float))
-(f64vector-set! (#(procedure #:enforce) f64vector-set! ((struct f64vector) fixnum number) undefined))
-
-(f64vector? (#(procedure #:predicate (struct f64vector)) f64vector? (*) boolean))
-
-(list->f32vector (#(procedure #:enforce) list->f32vector ((list number)) (struct f32vector)))
-(list->f64vector (#(procedure #:enforce) list->f64vector ((list number)) (struct f64vector)))
-(list->s16vector (#(procedure #:enforce) list->s16vector ((list fixnum)) (struct s16vector)))
-(list->s32vector (#(procedure #:enforce) list->s32vector ((list number)) (struct s32vector)))
-(list->s8vector (#(procedure #:enforce) list->s8vector ((list fixnum)) (struct s8vector)))
-(list->u16vector (#(procedure #:enforce) list->u16vector ((list fixnum)) (struct u16vector)))
-(list->u32vector (#(procedure #:enforce) list->u32vector ((list number)) (struct u32vector)))
-(list->u8vector (#(procedure #:enforce) list->u8vector ((list fixnum)) (struct u8vector)))
-(make-f32vector (#(procedure #:enforce) make-f32vector (fixnum #!optional * * *) (struct f32vector)))
-(make-f64vector (#(procedure #:enforce) make-f64vector (fixnum #!optional * * *) (struct f64vector)))
-(make-s16vector (#(procedure #:enforce) make-s16vector (fixnum #!optional * * *) (struct s16vector)))
-(make-s32vector (#(procedure #:enforce) make-s32vector (fixnum #!optional * * *) (struct s32vector)))
-(make-s8vector (#(procedure #:enforce) make-s8vector (fixnum #!optional * * *) (struct s8vector)))
-(make-u16vector (#(procedure #:enforce) make-u16vector (fixnum #!optional * * *) (struct u16vector)))
-(make-u32vector (#(procedure #:enforce) make-u32vector (fixnum #!optional * * *) (struct u32vector)))
-(make-u8vector (#(procedure #:enforce) make-u8vector (fixnum #!optional * * *) (struct u8vector)))
+(f64vector-ref (#(procedure #:clean #:enforce) f64vector-ref ((struct f64vector) fixnum) float))
+(f64vector-set! (#(procedure #:clean #:enforce) f64vector-set! ((struct f64vector) fixnum number) undefined))
+
+(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)))
+(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)))
+(make-s32vector (#(procedure #:clean #:enforce) make-s32vector (fixnum #!optional * * *) (struct s32vector)))
+(make-s8vector (#(procedure #:clean #:enforce) make-s8vector (fixnum #!optional * * *) (struct s8vector)))
+(make-u16vector (#(procedure #:clean #:enforce) make-u16vector (fixnum #!optional * * *) (struct u16vector)))
+(make-u32vector (#(procedure #:clean #:enforce) make-u32vector (fixnum #!optional * * *) (struct u32vector)))
+(make-u8vector (#(procedure #:clean #:enforce) make-u8vector (fixnum #!optional * * *) (struct u8vector)))
 (read-u8vector (#(procedure #:enforce) read-u8vector (#!optional fixnum port) (struct u8vector)))
 (read-u8vector! (#(procedure #:enforce) read-u8vector! (fixnum (struct u8vector) #!optional port fixnum) number))
 (release-number-vector (procedure release-number-vector (*) undefined))
-(s16vector (#(procedure #:enforce) s16vector (#!rest fixnum) (struct s16vector)))
-(s16vector->blob (#(procedure #:enforce) s16vector->blob ((struct s16vector)) blob))
-(s16vector->blob/shared (#(procedure #:enforce) s16vector->blob/shared ((struct s16vector)) blob))
-(s16vector->list (#(procedure #:enforce) s16vector->list ((struct s16vector)) (list fixnum)))
+(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-length (#(procedure #:enforce) s16vector-length ((struct s16vector)) fixnum)
+(s16vector-length (#(procedure #:clean #:enforce) s16vector-length ((struct s16vector)) fixnum)
 		  (((struct s16vector)) (##core#inline "C_u_i_16vector_length" #(1))))
 
-(s16vector-ref (#(procedure #:enforce) s16vector-ref ((struct s16vector) fixnum) fixnum))
-(s16vector-set! (#(procedure #:enforce) s16vector-set! ((struct s16vector) fixnum fixnum) undefined))
+(s16vector-ref (#(procedure #:clean #:enforce) s16vector-ref ((struct s16vector) fixnum) fixnum))
+(s16vector-set! (#(procedure #:clean #:enforce) s16vector-set! ((struct s16vector) fixnum fixnum) undefined))
 
-(s16vector? (#(procedure #:predicate (struct s16vector)) s16vector? (*) boolean))
+(s16vector? (#(procedure #:pure #:predicate (struct s16vector)) s16vector? (*) boolean))
 
-(s32vector (#(procedure #:enforce) s32vector (#!rest number) (struct s32vector)))
-(s32vector->blob (#(procedure #:enforce) s32vector->blob ((struct 32vector)) blob))
-(s32vector->blob/shared (#(procedure #:enforce) s32vector->blob/shared ((struct s32vector)) blob))
-(s32vector->list (#(procedure #:enforce) s32vector->list ((struct s32vector)) (list number)))
+(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-length (#(procedure #:enforce) s32vector-length ((struct s32vector)) fixnum)
+(s32vector-length (#(procedure #:clean #:enforce) s32vector-length ((struct s32vector)) fixnum)
 		  (((struct s32vector)) (##core#inline "C_u_i_32vector_length" #(1))))
 
-(s32vector-ref (#(procedure #:enforce) s32vector-ref ((struct s32vector) fixnum) number))
-(s32vector-set! (#(procedure #:enforce) s32vector-set! ((struct s32vector) fixnum number) undefined))
+(s32vector-ref (#(procedure #:clean #:enforce) s32vector-ref ((struct s32vector) fixnum) number))
+(s32vector-set! (#(procedure #:clean #:enforce) s32vector-set! ((struct s32vector) fixnum number) undefined))
 
-(s32vector? (#(procedure #:predicate (struct s32vector)) s32vector? (*) boolean))
+(s32vector? (#(procedure #:pure #:predicate (struct s32vector)) s32vector? (*) boolean))
 
-(s8vector (#(procedure #:enforce) s8vector (#!rest fixnum) (struct s8vector)))
-(s8vector->blob (#(procedure #:enforce) s8vector->blob ((struct s8vector)) blob))
-(s8vector->blob/shared (#(procedure #:enforce) s8vector->blob/shared ((struct s8vector)) blob))
-(s8vector->list (#(procedure #:enforce) s8vector->list ((struct s8vector)) (list fixnum)))
+(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-length (#(procedure #:enforce) s8vector-length ((struct s8vector)) fixnum)
+(s8vector-length (#(procedure #:clean #:enforce) s8vector-length ((struct s8vector)) fixnum)
 		 (((struct s8vector)) (##core#inline "C_u_i_8vector_length" #(1))))
 
-(s8vector-ref (#(procedure #:enforce) s8vector-ref ((struct s8vector) fixnum) fixnum))
-(s8vector-set! (#(procedure #:enforce) s8vector-set! ((struct s8vector) fixnum fixnum) undefined))
-
-(s8vector? (#(procedure #:predicate (struct s8vector)) s8vector? (*) boolean))
-
-(subf32vector (#(procedure #:enforce) subf32vector ((struct f32vector) fixnum fixnum) (struct f32vector)))
-(subf64vector (#(procedure #:enforce) subf64vector ((struct f64vector) fixnum fixnum) (struct f64vector)))
-(subs16vector (#(procedure #:enforce) subs16vector ((struct s16vector) fixnum fixnum) (struct s16vector)))
-(subs32vector (#(procedure #:enforce) subs32vector ((struct s32vector) fixnum fixnum) (struct s32vector)))
-(subs8vector (#(procedure #:enforce) subs8vector  ((struct s8vector) fixnum fixnum) (struct s8vector)))
-(subu16vector (#(procedure #:enforce) subu16vector ((struct u16vector) fixnum fixnum) (struct u16vector)))
-(subu32vector (#(procedure #:enforce) subu32vector ((struct u32vector) fixnum fixnum) (struct u32vector)))
-(subu8vector (#(procedure #:enforce) subu8vector ((struct u8vector) fixnum fixnum) (struct u8vector)))
-(u16vector (#(procedure #:enforce) u16vector (#!rest fixnum) (struct u16vector)))
-(u16vector->blob (#(procedure #:enforce) u16vector->blob ((struct u16vector)) blob))
-(u16vector->blob/shared (#(procedure #:enforce) u16vector->blob/shared ((struct u16vector)) blob))
-(u16vector->list (#(procedure #:enforce) u16vector->list ((struct u16vector)) (list fixnum)))
-
-(u16vector-length (#(procedure #:enforce) u16vector-length ((struct u16vector)) fixnum)
+(s8vector-ref (#(procedure #:clean #:enforce) s8vector-ref ((struct s8vector) fixnum) fixnum))
+(s8vector-set! (#(procedure #:clean #:enforce) s8vector-set! ((struct s8vector) fixnum fixnum) undefined))
+
+(s8vector? (#(procedure #:pure #:predicate (struct s8vector)) s8vector? (*) boolean))
+
+(subf32vector (#(procedure #:clean #:enforce) subf32vector ((struct f32vector) fixnum fixnum) (struct f32vector)))
+(subf64vector (#(procedure #:clean #:enforce) subf64vector ((struct f64vector) fixnum fixnum) (struct f64vector)))
+(subs16vector (#(procedure #:clean #:enforce) subs16vector ((struct s16vector) fixnum fixnum) (struct s16vector)))
+(subs32vector (#(procedure #:clean #:enforce) subs32vector ((struct s32vector) fixnum fixnum) (struct s32vector)))
+(subs8vector (#(procedure #:clean #:enforce) subs8vector  ((struct s8vector) fixnum fixnum) (struct s8vector)))
+(subu16vector (#(procedure #:clean #:enforce) subu16vector ((struct u16vector) fixnum fixnum) (struct u16vector)))
+(subu32vector (#(procedure #:clean #:enforce) subu32vector ((struct u32vector) fixnum fixnum) (struct u32vector)))
+(subu8vector (#(procedure #:clean #:enforce) subu8vector ((struct u8vector) fixnum fixnum) (struct u8vector)))
+(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-length (#(procedure #:clean #:enforce) u16vector-length ((struct u16vector)) fixnum)
 		  (((struct u16vector)) (##core#inline "C_u_i_16vector_length" #(1))))
 
-(u16vector-ref (#(procedure #:enforce) u16vector-ref ((struct u16vector) fixnum) fixnum))
-(u16vector-set! (#(procedure #:enforce) u16vector-set! ((struct u16vector) fixnum fixnum) undefined))
+(u16vector-ref (#(procedure #:clean #:enforce) u16vector-ref ((struct u16vector) fixnum) fixnum))
+(u16vector-set! (#(procedure #:clean #:enforce) u16vector-set! ((struct u16vector) fixnum fixnum) undefined))
 
-(u16vector? (#(procedure #:predicate (struct u16vector)) u16vector? (*) boolean))
+(u16vector? (#(procedure #:pure #:predicate (struct u16vector)) u16vector? (*) boolean))
 
-(u32vector (#(procedure #:enforce) u32vector (#!rest number) (struct u32vector)))
-(u32vector->blob (#(procedure #:enforce) u32vector->blob ((struct u32vector)) blob))
-(u32vector->blob/shared (#(procedure #:enforce) u32vector->blob/shared ((struct u32vector)) blob))
-(u32vector->list (#(procedure #:enforce) u32vector->list ((struct u32vector)) (list number)))
+(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-length (#(procedure #:enforce) u32vector-length ((struct u32vector)) fixnum)
+(u32vector-length (#(procedure #:clean #:enforce) u32vector-length ((struct u32vector)) fixnum)
 		  (((struct u32vector)) (##core#inline "C_u_i_32vector_length" #(1))))
 
-(u32vector-ref (#(procedure #:enforce) u32vector-ref ((struct u32vector) fixnum) number))
-(u32vector-set! (#(procedure #:enforce) u32vector-set! ((struct u32vector) fixnum number) undefined))
+(u32vector-ref (#(procedure #:clean #:enforce) u32vector-ref ((struct u32vector) fixnum) number))
+(u32vector-set! (#(procedure #:clean #:enforce) u32vector-set! ((struct u32vector) fixnum number) undefined))
 
-(u32vector? (#(procedure #:predicate (struct u32vector)) u32vector? (*) boolean))
+(u32vector? (#(procedure #:pure #:predicate (struct u32vector)) u32vector? (*) boolean))
 
-(u8vector (#(procedure #:enforce) u8vector (#!rest fixnum) (struct u8vector)))
-(u8vector->blob (#(procedure #:enforce) u8vector->blob ((struct u8vector)) blob))
-(u8vector->blob/shared (#(procedure #:enforce) u8vector->blob/shared ((struct u8vector)) blob))
-(u8vector->list (#(procedure #:enforce) u8vector->list ((struct u8vector)) (list fixnum)))
+(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-length (#(procedure #:enforce) u8vector-length ((struct u8vector)) fixnum)
+(u8vector-length (#(procedure #:clean #:enforce) u8vector-length ((struct u8vector)) fixnum)
 		 (((struct u8vector)) (##core#inline "C_u_i_8vector_length" #(1))))
 
-(u8vector-ref (#(procedure #:enforce) u8vector-ref ((struct u8vector) fixnum) fixnum))
-(u8vector-set! (#(procedure #:enforce) u8vector-set! ((struct u8vector) fixnum fixnum) undefined))
+(u8vector-ref (#(procedure #:clean #:enforce) u8vector-ref ((struct u8vector) fixnum) fixnum))
+(u8vector-set! (#(procedure #:clean #:enforce) u8vector-set! ((struct u8vector) fixnum fixnum) undefined))
 
-(u8vector? (#(procedure #:predicate (struct u8vector)) u8vector? (*) boolean))
+(u8vector? (#(procedure #:pure #:predicate (struct u8vector)) u8vector? (*) boolean))
 
 (write-u8vector (#(procedure #:enforce) write-u8vector ((struct u8vector) #!optional port fixnum fixnum) undefined))
 
 
 ;; srfi-69
 
-(alist->hash-table (#(procedure #:enforce) alist->hash-table ((list pair) #!rest) (struct hash-table)))
-(eq?-hash (#(procedure #:enforce) eq?-hash (* #!optional fixnum) fixnum))
-(equal?-hash (#(procedure #:enforce) equal?-hash (* #!optional fixnum) fixnum))
-(eqv?-hash (#(procedure #:enforce) eqv?-hash (* #!optional fixnum) fixnum))
-(hash (#(procedure #:enforce) hash (* #!optional fixnum) fixnum))
-(hash-by-identity (#(procedure #:enforce) hash-by-identity (* #!optional fixnum) fixnum))
-(hash-table->alist (#(procedure #:enforce) hash-table->alist ((struct hash-table)) (list pair)))
-(hash-table-clear! (#(procedure #:enforce) hash-table-clear! ((struct hash-table)) undefined))
-(hash-table-copy (#(procedure #:enforce) hash-table-copy ((struct hash-table)) (struct hash-table)))
-(hash-table-delete! (#(procedure #:enforce) hash-table-delete! ((struct hash-table) *) boolean))
-(hash-table-equivalence-function (#(procedure #:enforce) hash-table-equivalence-function ((struct hash-table)) (procedure (* *) *)))
-(hash-table-exists? (#(procedure #:enforce) hash-table-exists? ((struct hash-table) *) boolean))
+(alist->hash-table (#(procedure #:clean #:enforce) alist->hash-table ((list 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-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))
+(hash-table-equivalence-function (#(procedure #:clean #:enforce) hash-table-equivalence-function ((struct hash-table)) (procedure (* *) *)))
+(hash-table-exists? (#(procedure #:clean #:enforce) hash-table-exists? ((struct hash-table) *) boolean))
 (hash-table-fold (#(procedure #:enforce) hash-table-fold ((struct hash-table) (procedure (* * *) *) *) *))
 (hash-table-for-each (#(procedure #:enforce) hash-table-for-each ((struct hash-table) (procedure (* *) . *)) undefined))
 
-(hash-table-has-initial? (#(procedure #:enforce) hash-table-has-initial? ((struct hash-table)) boolean)
+(hash-table-has-initial? (#(procedure #:clean #:enforce) hash-table-has-initial? ((struct hash-table)) boolean)
 			 (((struct hash-table)) (##sys#slot #(1) '9))) ;XXX might return other than #t
 
-(hash-table-hash-function (#(procedure #:enforce) hash-table-hash-function ((struct hash-table)) (procedure (* fixnum) fixnum))
+(hash-table-hash-function (#(procedure #:clean #:enforce) hash-table-hash-function ((struct hash-table)) (procedure (* fixnum) fixnum))
 			  (((struct hash-table)) (##sys#slot #(1) '4)))
 
-(hash-table-initial (#(procedure #:enforce) hash-table-initial ((struct hash-table)) *))
-(hash-table-keys (#(procedure #:enforce) hash-table-keys ((struct hash-table)) list))
-(hash-table-map (#(procedure #:enforce) hash-table-map ((struct hash-table) (procedure (* *) *)) list))
+(hash-table-initial (#(procedure #:clean #:enforce) hash-table-initial ((struct hash-table)) *))
+(hash-table-keys (#(procedure #:clean #:enforce) hash-table-keys ((struct hash-table)) list))
+(hash-table-map (#(procedure #:clean #:enforce) hash-table-map ((struct hash-table) (procedure (* *) *)) list))
 
-(hash-table-max-load (#(procedure #:enforce) hash-table-max-load ((struct hash-table)) fixnum)
+(hash-table-max-load (#(procedure #:clean #:enforce) hash-table-max-load ((struct hash-table)) fixnum)
 		     (((struct hash-table)) (##sys#slot #(1) '6)))
 
-(hash-table-merge (#(procedure #:enforce) hash-table-merge ((struct hash-table) (struct hash-table)) (struct hash-table)))
-(hash-table-merge! (#(procedure #:enforce) hash-table-merge! ((struct hash-table) (struct hash-table)) undefined))
+(hash-table-merge (#(procedure #:clean #:enforce) hash-table-merge ((struct hash-table) (struct hash-table)) (struct hash-table)))
+(hash-table-merge! (#(procedure #:clean #:enforce) hash-table-merge! ((struct hash-table) (struct hash-table)) undefined))
 
-(hash-table-min-load (#(procedure #:enforce) hash-table-min-load ((struct hash-table)) fixnum)
+(hash-table-min-load (#(procedure #:clean #:enforce) hash-table-min-load ((struct hash-table)) fixnum)
 		     (((struct hash-table)) (##sys#slot #(1) '5)))
 
-(hash-table-ref (#(procedure #:enforce) hash-table-ref ((struct hash-table) * #!optional (procedure () *)) *))
-(hash-table-ref/default (#(procedure #:enforce) hash-table-ref/default ((struct hash-table) * *) *))
-(hash-table-remove! (#(procedure #:enforce) hash-table-remove! ((struct hash-table) (procedure (* *) *)) undefined))
-(hash-table-set! (#(procedure #:enforce) hash-table-set! ((struct hash-table) * *) undefined))
+(hash-table-ref (#(procedure #:clean #:enforce) hash-table-ref ((struct hash-table) * #!optional (procedure () *)) *))
+(hash-table-ref/default (#(procedure #:clean #:enforce) hash-table-ref/default ((struct hash-table) * *) *))
+(hash-table-remove! (#(procedure #:clean #:enforce) hash-table-remove! ((struct hash-table) (procedure (* *) *)) undefined))
+(hash-table-set! (#(procedure #:clean #:enforce) hash-table-set! ((struct hash-table) * *) undefined))
 
-(hash-table-size (#(procedure #:enforce) hash-table-size ((struct hash-table)) fixnum)
+(hash-table-size (#(procedure #:clean #:enforce) hash-table-size ((struct hash-table)) fixnum)
 		 (((struct hash-table)) (##sys#slot #(1) '2)))
 
 (hash-table-update! (#(procedure #:enforce) hash-table-update! ((struct hash-table) * (procedure (*) *) #!optional (procedure () *)) *))
-(hash-table-update!/default (#(procedure #:enforce) hash-table-update!/default ((struct hash-table) * (procedure (*) *) *) *))
-(hash-table-values (#(procedure #:enforce) hash-table-values ((struct hash-table)) list))
+(hash-table-update!/default (#(procedure #:clean #:enforce) hash-table-update!/default ((struct hash-table) * (procedure (*) *) *) *))
+(hash-table-values (#(procedure #:clean #:enforce) hash-table-values ((struct hash-table)) list))
 (hash-table-walk (#(procedure #:enforce) hash-table-walk ((struct hash-table) (procedure (* *) . *)) undefined))
 
-(hash-table-weak-keys (#(procedure #:enforce) hash-table-weak-keys ((struct hash-table)) boolean)
+(hash-table-weak-keys (#(procedure #:clean #:enforce) hash-table-weak-keys ((struct hash-table)) boolean)
 		      (((struct hash-table)) (##sys#slot #(1) '7)))
 
-(hash-table-weak-values (#(procedure #:enforce) hash-table-weak-values ((struct hash-table)) boolean)
+(hash-table-weak-values (#(procedure #:clean #:enforce) hash-table-weak-values ((struct hash-table)) boolean)
 			(((struct hash-table)) (##sys#slot #(1) '8)))
 
-(hash-table? (#(procedure #:predicate (struct hash-table)) hash-table? (*) boolean))
+(hash-table? (#(procedure #:pure #:predicate (struct hash-table)) hash-table? (*) boolean))
 
 ;;XXX if we want to hardcode hash-default-bound here, we could rewrite the 1-arg case...
 ;     (applies to all hash-functions)
-(keyword-hash (#(procedure #:enforce) keyword-hash (* #!optional fixnum) fixnum))
+(keyword-hash (#(procedure #:clean #:enforce) keyword-hash (* #!optional fixnum) fixnum))
 
-(make-hash-table (#(procedure #:enforce) make-hash-table (#!rest) (struct hash-table)))
-(number-hash (#(procedure #:enforce) number-hash (fixnum #!optional fixnum) fixnum))
-(object-uid-hash (#(procedure #:enforce) object-uid-hash (* #!optional fixnum) fixnum))
-(symbol-hash (#(procedure #:enforce) symbol-hash (symbol #!optional fixnum) fixnum))
-(string-hash (#(procedure #:enforce) string-hash (string #!optional fixnum fixnum fixnum) number))
-(string-hash-ci (#(procedure #:enforce) string-hash-ci (string #!optional fixnum fixnum fixnum) number))
-(string-ci-hash (#(procedure #:enforce) string-ci-hash (string #!optional fixnum fixnum fixnum) number))
+(make-hash-table (#(procedure #:clean #:enforce) make-hash-table (#!rest) (struct hash-table)))
+(number-hash (#(procedure #:clean #:enforce) number-hash (fixnum #!optional fixnum) fixnum))
+(object-uid-hash (#(procedure #:clean #:enforce) object-uid-hash (* #!optional fixnum) fixnum))
+(symbol-hash (#(procedure #:clean #:enforce) symbol-hash (symbol #!optional fixnum) fixnum))
+(string-hash (#(procedure #:clean #:enforce) string-hash (string #!optional fixnum fixnum fixnum) number))
+(string-hash-ci (#(procedure #:clean #:enforce) string-hash-ci (string #!optional fixnum fixnum fixnum) number))
+(string-ci-hash (#(procedure #:clean #:enforce) string-ci-hash (string #!optional fixnum fixnum fixnum) number))
 
 
 ;; tcp
 
-(tcp-abandon-port (#(procedure #:enforce) tcp-abandon-port (port) undefined))
-(tcp-accept (#(procedure #:enforce) tcp-accept ((struct tcp-listener)) port port))
-(tcp-accept-ready? (#(procedure #:enforce) tcp-accept-ready? ((struct tcp-listener)) boolean))
-(tcp-accept-timeout (#(procedure #:enforce) tcp-accept-timeout (#!optional number) number))
-(tcp-addresses (#(procedure #:enforce) tcp-addresses (port) string string))
-(tcp-buffer-size (#(procedure #:enforce) tcp-buffer-size (#!optional fixnum) fixnum))
-(tcp-close (#(procedure #:enforce) tcp-close ((struct tcp-listener)) undefined))
-(tcp-connect (#(procedure #:enforce) tcp-connect (string #!optional fixnum) port port))
-(tcp-connect-timeout (#(procedure #:enforce) tcp-connect-timeout (#!optional number) number))
-(tcp-listen (#(procedure #:enforce) tcp-listen (fixnum #!optional fixnum *) (struct tcp-listener)))
-
-(tcp-listener-fileno (#(procedure #:enforce) tcp-listener-fileno ((struct tcp-listener)) fixnum)
+(tcp-abandon-port (#(procedure #:clean #:enforce) tcp-abandon-port (port) undefined))
+(tcp-accept (#(procedure #:clean #:enforce) tcp-accept ((struct tcp-listener)) port port))
+(tcp-accept-ready? (#(procedure #:clean #:enforce) tcp-accept-ready? ((struct tcp-listener)) boolean))
+(tcp-accept-timeout (#(procedure #:clean #:enforce) tcp-accept-timeout (#!optional number) number))
+(tcp-addresses (#(procedure #:clean #:enforce) tcp-addresses (port) string string))
+(tcp-buffer-size (#(procedure #:clean #:enforce) tcp-buffer-size (#!optional fixnum) fixnum))
+(tcp-close (#(procedure #:clean #:enforce) tcp-close ((struct tcp-listener)) undefined))
+(tcp-connect (#(procedure #:clean #:enforce) tcp-connect (string #!optional fixnum) port port))
+(tcp-connect-timeout (#(procedure #:clean #:enforce) tcp-connect-timeout (#!optional number) number))
+(tcp-listen (#(procedure #:clean #:enforce) tcp-listen (fixnum #!optional fixnum *) (struct tcp-listener)))
+
+(tcp-listener-fileno (#(procedure #:clean #:enforce) tcp-listener-fileno ((struct tcp-listener)) fixnum)
 		     (((struct tcp-listener)) (##sys#slot #(1) '1)))
 
-(tcp-listener-port (#(procedure #:enforce) tcp-listener-port ((struct tcp-listener)) fixnum))
+(tcp-listener-port (#(procedure #:clean #:enforce) tcp-listener-port ((struct tcp-listener)) fixnum))
 
-(tcp-listener? (#(procedure #:predicate (struct tcp-listener)) tcp-listener? (*) boolean))
+(tcp-listener? (#(procedure #:clean #:predicate (struct tcp-listener)) tcp-listener? (*) boolean))
 
-(tcp-port-numbers (#(procedure #:enforce) tcp-port-numbers (port) fixnum fixnum))
-(tcp-read-timeout (#(procedure #:enforce) tcp-read-timeout (#!optional number) number))
-(tcp-write-timeout (#(procedure #:enforce) tcp-write-timeout (#!optional number) number))
+(tcp-port-numbers (#(procedure #:clean #:enforce) tcp-port-numbers (port) fixnum fixnum))
+(tcp-read-timeout (#(procedure #:clean #:enforce) tcp-read-timeout (#!optional number) number))
+(tcp-write-timeout (#(procedure #:clean #:enforce) tcp-write-timeout (#!optional number) number))
 
 
 ;; utils
@@ -2462,9 +2471,9 @@
 (for-each-argv-line deprecated)
 (for-each-line deprecated)
 (read-all (#(procedure #:enforce) read-all (#!optional (or port string)) string))
-(system* (#(procedure #:enforce) system* (string #!rest) undefined))
-(qs (#(procedure #:enforce) qs (string) string))
-(compile-file (#(procedure #:enforce) compile-file (string #!rest) (or boolean string)))
-(compile-file-options (#(procedure #:enforce) compile-file-options (#!optional (list string)) (list string)))
+(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)))
 (scan-input-lines (#(procedure #:enforce) scan-input-lines (* #!optional port) *))
 (yes-or-no? (#(procedure #:enforce) yes-or-no? (string #!rest) *))
Trap