~ chicken-core (chicken-5) e582245949e4c571bd97cc4177538d10603ee6ee


commit e582245949e4c571bd97cc4177538d10603ee6ee
Author:     felix <bunny351@gmail.com>
AuthorDate: Mon Jun 14 17:12:20 2010 +0200
Commit:     felix <bunny351@gmail.com>
CommitDate: Mon Jun 14 17:12:20 2010 +0200

    heavy cleanup in srfi-4 (not completely tested, yet)

diff --git a/c-platform.scm b/c-platform.scm
index 110f9c1a..1394c21a 100644
--- a/c-platform.scm
+++ b/c-platform.scm
@@ -720,6 +720,7 @@
 (rewrite '##sys#vector-length 2 1 "C_i_vector_length" #t)
 (rewrite 'string-length 2 1 "C_i_string_length" #t)
 (rewrite 'inexact->exact 2 1 "C_i_inexact_to_exact" #t)
+(rewrite '##sys#inexact->exact 2 1 "C_i_inexact_to_exact" #t)
 
 (rewrite '##sys#check-exact 2 1 "C_i_check_exact" #t)
 (rewrite '##sys#check-number 2 1 "C_i_check_number" #t)
@@ -798,6 +799,7 @@
 (rewrite '<= 13 "C_less_or_equal_p" #t)
 
 (rewrite 'exact->inexact 13 "C_exact_to_inexact" #t)
+(rewrite '##sys#exact->inexact 13 "C_exact_to_inexact" #t)
 (rewrite 'string->number 13 "C_string_to_number" #t)
 (rewrite 'number->string 13 "C_number_to_string" #t)
 (rewrite '##sys#call-with-current-continuation 13 "C_call_cc" #t)
diff --git a/chicken.h b/chicken.h
index 7bd068f4..2ca22927 100644
--- a/chicken.h
+++ b/chicken.h
@@ -1282,6 +1282,14 @@ extern double trunc(double);
 #define C_u_i_16vector_length(x)        C_fix(C_header_size(C_block_item(x, 1)) >> 1)
 #define C_u_i_32vector_length(x)        C_fix(C_header_size(C_block_item(x, 1)) >> 2)
 #define C_u_i_64vector_length(x)        C_fix(C_header_size(C_block_item(x, 1)) >> 3)
+#define C_u_i_u8vector_length           C_u_i_8vector_length
+#define C_u_i_s8vector_length           C_u_i_8vector_length
+#define C_u_i_u16vector_length          C_u_i_16vector_length
+#define C_u_i_s16vector_length          C_u_i_16vector_length
+#define C_u_i_u32vector_length          C_u_i_32vector_length
+#define C_u_i_s32vector_length          C_u_i_32vector_length
+#define C_u_i_f32vector_length          C_u_i_32vector_length
+#define C_u_i_f64vector_length          C_u_i_64vector_length
 
 #define C_u_i_u8vector_ref(x, i)        C_fix(((unsigned char *)C_data_pointer(C_block_item((x), 1)))[ C_unfix(i) ])
 #define C_u_i_s8vector_ref(x, i)        C_fix(((char *)C_data_pointer(C_block_item((x), 1)))[ C_unfix(i) ])
diff --git a/eval.scm b/eval.scm
index 65e2dee9..2eef1f56 100644
--- a/eval.scm
+++ b/eval.scm
@@ -1710,13 +1710,3 @@
 
 (define-external (CHICKEN_get_error_message ((c-pointer "char") buf) (int bufsize)) void
   (store-string (or last-error "No error") bufsize buf) )
-
-
-;;; Create lambda-info object
-
-(define (##sys#make-lambda-info str)
-  (let* ((sz (##sys#size str))
-	 (info (##sys#make-string sz)) )
-    (##core#inline "C_copy_memory" info str sz)
-    (##core#inline "C_string_to_lambdainfo" info)
-    info) )
diff --git a/library.scm b/library.scm
index 593b4096..1a8514ab 100644
--- a/library.scm
+++ b/library.scm
@@ -2163,7 +2163,9 @@ EOF
 		(let* ([str (##sys#reverse-list->string seq)]
 		       [n (string->number str 16)])
 		  (or n
-		      (##sys#read-error port (string-append "invalid escape-sequence '\\" u str "\'")) ) )
+		      (##sys#read-error
+		       port
+		       (string-append "invalid escape-sequence '\\" u str "\'")) ) )
 		(let ([x (##sys#read-char-0 port)])
 		  (if (or (eof-object? x) (char=? #\" x))
 		    (##sys#read-error port "unterminated string constant") 
@@ -4472,6 +4474,16 @@ EOF
 	       (loop (fx- i 1)) ) ) ) ) )
 
 
+;;; Create lambda-info object
+
+(define (##sys#make-lambda-info str)
+  (let* ((sz (##sys#size str))
+	 (info (##sys#make-string sz)) )
+    (##core#inline "C_copy_memory" info str sz)
+    (##core#inline "C_string_to_lambdainfo" info)
+    info) )
+
+
 ;;; Function debug info:
 
 (define (##sys#lambda-info? x)
@@ -4528,8 +4540,10 @@ EOF
 
 (define setter ##sys#setter)
 
-(define (getter-with-setter get set)
-  (let ((getdec (##sys#lambda-info get))
+(define (getter-with-setter get set #!optional info)
+  (let ((getdec (if info
+		    (##sys#make-lambda-info info)
+		    (##sys#lambda-info get)))
 	(p1 (##sys#decorate-lambda
 	     get
 	     setter?
@@ -4545,22 +4559,22 @@ EOF
 	   p))
 	p1)))
 
-(set! car (getter-with-setter car set-car!))
-(set! cdr (getter-with-setter cdr set-cdr!))
-(set! caar (getter-with-setter caar (lambda (x y) (set-car! (car x) y))))
-(set! cadr (getter-with-setter cadr (lambda (x y) (set-car! (cdr x) y))))
-(set! cdar (getter-with-setter cdar (lambda (x y) (set-cdr! (car x) y))))
-(set! cddr (getter-with-setter cddr (lambda (x y) (set-cdr! (cdr x) y))))
-(set! caaar (getter-with-setter caaar (lambda (x y) (set-car! (caar x) y))))
-(set! caadr (getter-with-setter caadr (lambda (x y) (set-car! (cadr x) y))))
-(set! cadar (getter-with-setter cadar (lambda (x y) (set-car! (cdar x) y))))
-(set! caddr (getter-with-setter caddr (lambda (x y) (set-car! (cddr x) y))))
-(set! cdaar (getter-with-setter cdaar (lambda (x y) (set-cdr! (caar x) y))))
-(set! cdadr (getter-with-setter cdadr (lambda (x y) (set-cdr! (cadr x) y))))
-(set! cddar (getter-with-setter cddar (lambda (x y) (set-cdr! (cdar x) y))))
-(set! cdddr (getter-with-setter cdddr (lambda (x y) (set-cdr! (cddr x) y))))
-(set! string-ref (getter-with-setter string-ref string-set!))
-(set! vector-ref (getter-with-setter vector-ref vector-set!))
+(set! car (getter-with-setter car set-car! "(car p)"))
+(set! cdr (getter-with-setter cdr set-cdr! "(cdr p)"))
+(set! caar (getter-with-setter caar (lambda (x y) (set-car! (car x) y)) "(caar p)"))
+(set! cadr (getter-with-setter cadr (lambda (x y) (set-car! (cdr x) y)) "(cadr p)"))
+(set! cdar (getter-with-setter cdar (lambda (x y) (set-cdr! (car x) y)) "(cdar p)"))
+(set! cddr (getter-with-setter cddr (lambda (x y) (set-cdr! (cdr x) y)) "(cddr p)"))
+(set! caaar (getter-with-setter caaar (lambda (x y) (set-car! (caar x) y)) "(caaar p)"))
+(set! caadr (getter-with-setter caadr (lambda (x y) (set-car! (cadr x) y)) "(caadr p)"))
+(set! cadar (getter-with-setter cadar (lambda (x y) (set-car! (cdar x) y)) "(cadar p)"))
+(set! caddr (getter-with-setter caddr (lambda (x y) (set-car! (cddr x) y)) "(caddr p)"))
+(set! cdaar (getter-with-setter cdaar (lambda (x y) (set-cdr! (caar x) y)) "(cdaar p)"))
+(set! cdadr (getter-with-setter cdadr (lambda (x y) (set-cdr! (cadr x) y)) "(cdadr p)"))
+(set! cddar (getter-with-setter cddar (lambda (x y) (set-cdr! (cdar x) y)) "(cddar p)"))
+(set! cdddr (getter-with-setter cdddr (lambda (x y) (set-cdr! (cddr x) y)) "(cdddr p)"))
+(set! string-ref (getter-with-setter string-ref string-set! "(string-ref str i)"))
+(set! vector-ref (getter-with-setter vector-ref vector-set! "(vector-ref vec i)"))
 
 
 ;;; Property lists
@@ -4575,7 +4589,7 @@ EOF
   (##sys#check-symbol sym 'get)
   (##core#inline "C_i_getprop" sym prop default))
 
-(define get (getter-with-setter ##sys#get put!))
+(define get (getter-with-setter ##sys#get put! "(get sym prop . default)"))
 
 (define (remprop! sym prop)
   (##sys#check-symbol sym 'remprop!)
@@ -4603,7 +4617,8 @@ EOF
 	 (##sys#setslot sym 2 lst) 
 	 (##sys#signal-hook
 	  #:type-error "property-list must be of even length"
-	  lst sym)))))
+	  lst sym)))
+   "(symbol-plist sym)"))
 
 (define (get-properties sym props)
   (##sys#check-symbol sym 'get-properties)
diff --git a/lolevel.scm b/lolevel.scm
index 0d0346ba..6db68e2e 100644
--- a/lolevel.scm
+++ b/lolevel.scm
@@ -306,7 +306,13 @@ EOF
   (##sys#make-locative obj (optional index 0) #t 'make-weak-locative) )
 
 (define (locative-set! x y) (##core#inline "C_i_locative_set" x y))
-(define locative-ref (getter-with-setter (##core#primitive "C_locative_ref") locative-set!))
+
+(define locative-ref
+  (getter-with-setter 
+   (##core#primitive "C_locative_ref") 
+   locative-set!
+   "(locative-ref loc)"))
+
 (define (locative->object x) (##core#inline "C_i_locative_to_object" x))
 (define (locative? x) (and (##core#inline "C_blockp" x) (##core#inline "C_locativep" x)))
 
@@ -325,42 +331,50 @@ EOF
 (define pointer-u8-ref
   (getter-with-setter
    (lambda (p) (##core#inline "C_u_i_pointer_u8_ref" p))
-   pointer-u8-set!))
+   pointer-u8-set!
+   "(pointer-u8-ref p)"))
 
 (define pointer-s8-ref
   (getter-with-setter
    (lambda (p) (##core#inline "C_u_i_pointer_s8_ref" p))
-   pointer-s8-set!))
+   pointer-s8-set!
+   "(pointer-s8-ref p)"))
 
 (define pointer-u16-ref
   (getter-with-setter
    (lambda (p) (##core#inline "C_u_i_pointer_u16_ref" p))
-   pointer-u16-set!))
+   pointer-u16-set!
+   "(pointer-u16-ref p)"))
 
 (define pointer-s16-ref
   (getter-with-setter
    (lambda (p) (##core#inline "C_u_i_pointer_s16_ref" p))
-   pointer-s16-set!))
+   pointer-s16-set!
+   "(pointer-s16-ref p)"))
 
 (define pointer-u32-ref
   (getter-with-setter
    (lambda (p) (##core#inline_allocate ("C_a_u_i_pointer_u32_ref" 4) p)) ;XXX hardcoded size
-   pointer-u32-set!))
+   pointer-u32-set!
+   "(pointer-u32-ref p)"))
 
 (define pointer-s32-ref
   (getter-with-setter
    (lambda (p) (##core#inline_allocate ("C_a_u_i_pointer_s32_ref" 4) p)) ;XXX hardcoded size
-   pointer-s32-set!))
+   pointer-s32-set!
+   "(pointer-s32-ref p)"))
 
 (define pointer-f32-ref
   (getter-with-setter
    (lambda (p) (##core#inline_allocate ("C_a_u_i_pointer_f32_ref" 4) p)) ;XXX hardcoded size
-   pointer-f32-set!))
+   pointer-f32-set!
+   "(pointer-f32-ref p)"))
 
 (define pointer-f64-ref
   (getter-with-setter
    (lambda (p) (##core#inline_allocate ("C_a_u_i_pointer_f64_ref" 4) p)) ;XXX hardcoded size
-   pointer-f64-set!))
+   pointer-f64-set!
+   "(pointer-f64-ref p)"))
 
 
 ;;; Procedures extended with data:
@@ -402,7 +416,10 @@ EOF
 ;;; Accessors for arbitrary vector-like block objects:
 
 (define block-set! ##sys#block-set!)
-(define block-ref (getter-with-setter ##sys#block-ref ##sys#block-set!))
+
+(define block-ref 
+  (getter-with-setter
+   ##sys#block-ref ##sys#block-set! "(block-ref x i)"))
 
 (define (number-of-slots x)
   (##sys#check-generic-vector x 'number-of-slots)
@@ -454,7 +471,8 @@ EOF
      (##sys#check-generic-structure x 'record-instance-slot)
      (##sys#check-range i 0 (fx- (##sys#size x) 1) 'record-instance-slot)
      (##sys#slot x (fx+ i 1)) )
-   record-instance-slot-set!))
+   record-instance-slot-set!
+   "(record-instance-slot x i)"))
 
 (define (record->vector x)
   (##sys#check-generic-structure x 'record->vector)
diff --git a/posix-common.scm b/posix-common.scm
index 0771a218..50e5e066 100644
--- a/posix-common.scm
+++ b/posix-common.scm
@@ -48,7 +48,8 @@ EOF
        (when (fx< r 0)
 	 (posix-error 
 	  #:file-error 'set-file-modification-time
-	  "cannot set file modification-time" f t))))))
+	  "cannot set file modification-time" f t))))
+   "(file-modification-time f)"))
 
 (define (file-access-time f) (##sys#stat f #f 'file-access-time) _stat_st_atime)
 (define (file-change-time f) (##sys#stat f #f 'file-change-time) _stat_st_ctime)
diff --git a/posixunix.scm b/posixunix.scm
index e4768282..a7127ecb 100644
--- a/posixunix.scm
+++ b/posixunix.scm
@@ -820,7 +820,8 @@ EOF
        (when (< pos 0)
 	 (posix-error #:file-error 'file-position "cannot retrieve file position of port" port) )
        pos) )
-   set-file-position!) )		; doesn't accept WHENCE
+   set-file-position!		; doesn't accept WHENCE
+   "(file-position port)"))
 
 
 ;;; Directory stuff:
@@ -1142,7 +1143,8 @@ EOF
    (lambda (id)
      (when (fx< (##core#inline "C_setuid" id) 0)
        (##sys#update-errno)
-       (##sys#error 'set-user-id! "cannot set user ID" id) ) ) ) )
+       (##sys#error 'set-user-id! "cannot set user ID" id) ) )
+   "(current-user-id)"))
 
 (define current-effective-user-id
   (getter-with-setter
@@ -1151,7 +1153,8 @@ EOF
     (when (fx< (##core#inline "C_seteuid" id) 0)
       (##sys#update-errno)
       (##sys#error 
-	 'effective-user-id!-setter "cannot set effective user ID" id) ) ) ) )
+	 'effective-user-id!-setter "cannot set effective user ID" id) ) )
+   "(current-effective-used-id)"))
 
 (define current-group-id
   (getter-with-setter
@@ -1159,7 +1162,8 @@ EOF
    (lambda (id)
     (when (fx< (##core#inline "C_setgid" id) 0)
       (##sys#update-errno)
-      (##sys#error 'set-user-id! "cannot set group ID" id) ) ) ) )
+      (##sys#error 'set-user-id! "cannot set group ID" id) ) )
+   "(current-group-id)") )
 
 (define current-effective-group-id
   (getter-with-setter 
@@ -1168,7 +1172,8 @@ EOF
     (when (fx< (##core#inline "C_setegid" id) 0)
       (##sys#update-errno)
       (##sys#error 
-	 'effective-group-id!-setter "cannot set effective group ID" id) ) ) ) )
+	 'effective-group-id!-setter "cannot set effective group ID" id) ) )
+   "(current-effective-group-id)") )
 
 (define-foreign-variable _user-name nonnull-c-string "C_user->pw_name")
 (define-foreign-variable _user-passwd nonnull-c-string "C_user->pw_passwd")
@@ -1395,7 +1400,8 @@ EOF
      (##sys#check-exact pgid 'set-process-group-id!)
      (when (fx< (##core#inline "C_setpgid" pid pgid) 0)
        (##sys#update-errno)
-       (##sys#error 'set-process-group-id! "cannot set process group ID" pid pgid) ) ) ) )
+       (##sys#error 'set-process-group-id! "cannot set process group ID" pid pgid) ) )
+   "(process-group-id pid)"))
 
 
 ;;; Hard and symbolic links:
diff --git a/posixwin.scm b/posixwin.scm
index 7de366dc..77827a8f 100644
--- a/posixwin.scm
+++ b/posixwin.scm
@@ -1133,7 +1133,8 @@ EOF
        (when (< pos 0)
 	 (posix-error #:file-error 'file-position "cannot retrieve file position of port" port) )
        pos) )
-   set-file-position!) )		; doesn't accept WHENCE
+   set-file-position!
+   "(file-position port)") )		; doesn't accept WHENCE
 
 
 ;;; Directory stuff:
diff --git a/srfi-4.scm b/srfi-4.scm
index 3fd10347..c60c3983 100644
--- a/srfi-4.scm
+++ b/srfi-4.scm
@@ -28,31 +28,8 @@
 (declare
  (unit srfi-4)
  (disable-interrupts)
- (hide ##sys#u8vector-set! ##sys#s8vector-set! ##sys#u16vector-set! ##sys#s16vector-set!
-       ##sys#u32vector-set! ##sys#s32vector-set! ##sys#f32vector-set! ##sys#f64vector-set!
-       ##sys#u8vector-ref ##sys#s8vector-ref ##sys#u16vector-ref ##sys#s16vector-ref subvector
-       ##sys#u32vector-ref ##sys#s32vector-ref ##sys#f32vector-ref ##sys#f64vector-ref)
  (not inline ##sys#user-print-hook ##sys#number-hash-hook)
  (foreign-declare #<<EOF
-#define C_u8peek(b, i)         C_fix(((unsigned char *)C_data_pointer(b))[ C_unfix(i) ])
-#define C_s8peek(b, i)         C_fix(((char *)C_data_pointer(b))[ C_unfix(i) ])
-#define C_u16peek(b, i)        C_fix(((unsigned short *)C_data_pointer(b))[ C_unfix(i) ])
-#define C_s16peek(b, i)        C_fix(((short *)C_data_pointer(b))[ C_unfix(i) ])
-#ifdef C_SIXTY_FOUR
-# define C_a_u32peek(ptr, d, b, i) C_fix(((C_u32 *)C_data_pointer(b))[ C_unfix(i) ])
-# define C_a_s32peek(ptr, d, b, i) C_fix(((C_s32 *)C_data_pointer(b))[ C_unfix(i) ])
-#else
-# define C_a_u32peek(ptr, d, b, i) C_unsigned_int_to_num(ptr, ((C_u32 *)C_data_pointer(b))[ C_unfix(i) ])
-# define C_a_s32peek(ptr, d, b, i) C_int_to_num(ptr, ((C_s32 *)C_data_pointer(b))[ C_unfix(i) ])
-#endif
-#define C_u8poke(b, i, x)      ((((unsigned char *)C_data_pointer(b))[ C_unfix(i) ] = C_unfix(x)), C_SCHEME_UNDEFINED)
-#define C_s8poke(b, i, x)      ((((char *)C_data_pointer(b))[ C_unfix(i) ] = C_unfix(x)), C_SCHEME_UNDEFINED)
-#define C_u16poke(b, i, x)     ((((unsigned short *)C_data_pointer(b))[ C_unfix(i) ] = C_unfix(x)), C_SCHEME_UNDEFINED)
-#define C_s16poke(b, i, x)     ((((short *)C_data_pointer(b))[ C_unfix(i) ] = C_unfix(x)), C_SCHEME_UNDEFINED)
-#define C_u32poke(b, i, x)     ((((C_u32 *)C_data_pointer(b))[ C_unfix(i) ] = C_num_to_unsigned_int(x)), C_SCHEME_UNDEFINED)
-#define C_s32poke(b, i, x)     ((((C_s32 *)C_data_pointer(b))[ C_unfix(i) ] = C_num_to_int(x)), C_SCHEME_UNDEFINED)
-#define C_f32poke(b, i, x)     ((((float *)C_data_pointer(b))[ C_unfix(i) ] = C_flonum_magnitude(x)), C_SCHEME_UNDEFINED)
-#define C_f64poke(b, i, x)     ((((double *)C_data_pointer(b))[ C_unfix(i) ] = C_flonum_magnitude(x)), C_SCHEME_UNDEFINED)
 #define C_copy_subvector(to, from, start_to, start_from, bytes)   \
   (C_memcpy((C_char *)C_data_pointer(to) + C_unfix(start_to), (C_char *)C_data_pointer(from) + C_unfix(start_from), C_unfix(bytes)), \
     C_SCHEME_UNDEFINED)
@@ -64,6 +41,8 @@ EOF
 
 ;;; Helper routines:
 
+(declare (hide ##sys#check-exact-interval))
+
 (define ##sys#check-exact-interval
   (lambda (n from to loc)
     (##sys#check-exact n loc)
@@ -71,155 +50,206 @@ EOF
 	    (##core#inline "C_fixnum_greaterp" n to) )
 	(##sys#error loc "numeric value is not in expected range" n from to) ) ) )
 
-(define ##sys#check-inexact-interval
-  (lambda (n from to loc)
-    (##sys#check-number n loc)
-    (if (or (< n from) (> n to))
-	(##sys#error "numeric value is not in expected range" n from to) ) ) )
-
-
-;;; Primitive accessors:
+(define-inline (check-range i from to)
+  (##sys#check-exact i loc)
+  (unless (and (fx<= from i) (fx< i to))
+    (##sys#error-hook
+     (foreign-value "C_OUT_OF_RANGE_ERROR" int)
+     loc i from to) ) )
 
-(define (##sys#u8vector-ref v i) (##core#inline "C_u8peek" (##core#inline "C_slot" v 1) i))
-(define (##sys#s8vector-ref v i) (##core#inline "C_s8peek" (##core#inline "C_slot" v 1) i))
-(define (##sys#u16vector-ref v i) (##core#inline "C_u16peek" (##core#inline "C_slot" v 1) i))
-(define (##sys#s16vector-ref v i) (##core#inline "C_s16peek" (##core#inline "C_slot" v 1) i))
-(define (##sys#u32vector-ref v i) (##core#inline_allocate ("C_a_u32peek" 4) (##core#inline "C_slot" v 1) i))
-(define (##sys#s32vector-ref v i) (##core#inline_allocate ("C_a_s32peek" 4) (##core#inline "C_slot" v 1) i))
 
-(define (##sys#f32vector-ref v i)
-  (##core#inline_allocate ("C_a_i_f32vector_ref" 4) v i))
+;;; Get vector length:
 
-(define (##sys#f64vector-ref v i)
-  (##core#inline_allocate ("C_a_i_f64vector_ref" 4) v i))
+(define (u8vector-length x)
+  (##sys#check-structure x 'u8vector 'u8vector-length)
+  (##core#inline "C_u_i_8vector_length" x))
 
-(define (##sys#u8vector-set! v i x) (##core#inline "C_u8poke" (##core#inline "C_slot" v 1) i x))
-(define (##sys#s8vector-set! v i x) (##core#inline "C_s8poke" (##core#inline "C_slot" v 1) i x))
-(define (##sys#u16vector-set! v i x) (##core#inline "C_u16poke" (##core#inline "C_slot" v 1) i x))
-(define (##sys#s16vector-set! v i x) (##core#inline "C_s16poke" (##core#inline "C_slot" v 1) i x))
-(define (##sys#u32vector-set! v i x) (##core#inline "C_u32poke" (##core#inline "C_slot" v 1) i x))
-(define (##sys#s32vector-set! v i x) (##core#inline "C_s32poke" (##core#inline "C_slot" v 1) i x))
+(define (s8vector-length x)
+  (##sys#check-structure x 's8vector 's8vector-length)
+  (##core#inline "C_u_i_8vector_length" x))
 
-(define (##sys#f32vector-set! v i x)
-  (##core#inline "C_u_i_f32vector_set" v i x))
+(define (u16vector-length x)
+  (##sys#check-structure x 'u16vector 'u16vector-length)
+  (##core#inline "C_u_i_16vector_length" x))
 
-(define (##sys#f64vector-set! v i x)
-  (##core#inline "C_u_i_f64vector_set" v i x))
+(define (s16vector-length x)
+  (##sys#check-structure x 's16vector 's16vector-length)
+  (##core#inline "C_u_i_16vector_length" x))
 
+(define (u32vector-length x)
+  (##sys#check-structure x 'u32vector 'u32vector-length)
+  (##core#inline "C_u_i_32vector_length" x))
 
-;;; Get vector length:
+(define (s32vector-length x)
+  (##sys#check-structure x 's32vector 's32vector-length)
+  (##core#inline "C_u_i_32vector_length" x))
 
-(let ()
+(define (f32vector-length x)
+  (##sys#check-structure x 'f32vector 'f32vector-length)
+  (##core#inline "C_u_i_32vector_length" x))
 
-  (define (len tag shift loc)
-    (lambda (v)
-      (##sys#check-structure v tag loc)
-      (let ((bytes (##core#inline "C_block_size" (##core#inline "C_slot" v 1))))
-	(if shift
-	    (##core#inline "C_fixnum_shift_right" bytes shift)
-	    bytes) ) ) )
-
-  (set! u8vector-length (len 'u8vector #f 'u8vector-length))
-  (set! s8vector-length (len 's8vector #f 's8vector-length))
-  (set! u16vector-length (len 'u16vector 1 'u16vector-length))
-  (set! s16vector-length (len 's16vector 1 's16vector-length))
-  (set! u32vector-length (len 'u32vector 2 'u32vector-length))
-  (set! s32vector-length (len 's32vector 2 's32vector-length))
-  (set! f32vector-length (len 'f32vector 2 'f32vector-length))
-  (set! f64vector-length (len 'f64vector 3 'f64vector-length)) )
+(define (f64vector-length x)
+  (##sys#check-structure x 'f64vector 'f64vector-length)
+  (##core#inline "C_u_i_64vector_length" x))
 
 
 ;;; Safe accessors:
 
-(let ()
-
-  (define (get length acc loc)
-    (lambda (v i)
-      (let ((len (length v)))
-	(##sys#check-range i 0 len loc)
-	(acc v i) ) ) )
-
-  (define (set length upd loc)
-    (lambda (v i x)
-      (let ((len (length v)))
-	(##sys#check-exact x loc)
-	(##sys#check-range i 0 len loc)
-	(upd v i x) ) ) )
-
-  (define (setu length upd loc)
-    (lambda (v i x)
-      (let ((len (length v)))
-	(##sys#check-exact x loc)
-	(if (fx< x 0)
-	    (##sys#error loc "argument may not be negative" x) )
-	(##sys#check-range i 0 len loc)
-	(upd v i x) ) ) )
-
-  (define (setw length upd loc)
-    (lambda (v i x)
-      (let ((len (length v)))
-	(if (not (##sys#fits-in-int? x))
-	    (##sys#error loc "argument exceeds integer range" x) )
-	(##sys#check-range i 0 len loc)
-	(upd v i x) ) ) )
-
-  (define (setuw length upd loc)
-    (lambda (v i x)
-      (let ((len (length v)))
-	(cond ((negative? x)
-	       (##sys#error loc "argument may not be negative" x) )
-	      ((not (##sys#fits-in-unsigned-int? x))
-	       (##sys#error loc "argument exceeds integer range" x) ) )
-	(##sys#check-range i 0 len loc)
-	(upd v i x) ) ) )
-
-  (define (setf length upd loc)
-    (lambda (v i x)
-      (let ((len (length v)))
-	(##sys#check-number x loc)
-	(##sys#check-range i 0 len loc)
-	(upd v i (if (##core#inline "C_blockp" x)
-		     x
-		     (exact->inexact x) ) ) ) ) )
-
-  (set! u8vector-set! (setu u8vector-length ##sys#u8vector-set! 'u8vector-set!))
-  (set! s8vector-set! (set s8vector-length ##sys#s8vector-set! 's8vector-set!))
-  (set! u16vector-set! (setu u16vector-length ##sys#u16vector-set! 'u16vector-set!))
-  (set! s16vector-set! (set s16vector-length ##sys#s16vector-set! 's16vector-set!))
-  (set! u32vector-set! (setuw u32vector-length ##sys#u32vector-set! 'u32vector-set!))
-  (set! s32vector-set! (setw s32vector-length ##sys#s32vector-set! 's32vector-set!))
-  (set! f32vector-set! (setf f32vector-length ##sys#f32vector-set! 'f32vector-set!))
-  (set! f64vector-set! (setf f64vector-length ##sys#f64vector-set! 'f64vector-set!))
-
-  (set! u8vector-ref
-	(getter-with-setter (get u8vector-length ##sys#u8vector-ref 'u8vector-ref)
-			    u8vector-set!) )
-  (set! s8vector-ref
-	(getter-with-setter (get s8vector-length ##sys#s8vector-ref 's8vector-ref)
-			    s8vector-set!) )
-  (set! u16vector-ref
-	(getter-with-setter (get u16vector-length ##sys#u16vector-ref 'u16vector-ref)
-			    u16vector-set!) )
-  (set! s16vector-ref
-	(getter-with-setter (get s16vector-length ##sys#s16vector-ref 's16vector-ref)
-			    s16vector-set!) )
-  (set! u32vector-ref
-	(getter-with-setter
-	 (get u32vector-length ##sys#u32vector-ref 'u32vector-ref)
-	 u32vector-set!) )
-  (set! s32vector-ref
-	(getter-with-setter
-	 (get s32vector-length ##sys#s32vector-ref 's32vector-ref)
-	 s32vector-set!) )
-  (set! f32vector-ref
-	(getter-with-setter
-	 (get f32vector-length ##sys#f32vector-ref 'f32vector-ref)
-	 f32vector-set!) )
-  (set! f64vector-ref
-	(getter-with-setter
-	 (get f64vector-length ##sys#f64vector-ref 'f64vector-ref)
-	 f64vector-set!) ) )
-
+(define (u8vector-set! x i y)
+  (##sys#check-structure x 'u8vector 'u8vector-set!)
+  (let ((len (##core#inline "C_u_i_8vector_length" x)))
+    (##sys#check-exact y 'u8vector-set!)
+    (when (fx< y 0)
+      (##sys#error 'u8vector-set! "argument may not be negative" y))
+    (check-range i 0 len 'u8vector-set!)
+    (##core#inline "C_u_i_u8vector_set" x i y)))
+
+(define (s8vector-set! x i y)
+  (##sys#check-structure x 's8vector 's8vector-set!)
+  (let ((len (##core#inline "C_u_i_8vector_length" x)))
+    (##sys#check-exact y 's8vector-set!)
+    (check-range i 0 len 's8vector-set!)
+    (##core#inline "C_u_i_s8vector_set" x i y)))
+
+(define (u16vector-set! x i y)
+  (##sys#check-structure x 'u16vector 'u16vector-set!)
+  (let ((len (##core#inline "C_u_i_16vector_length" x)))
+    (##sys#check-exact y 'u16vector-set!)
+    (when (fx< y 0)
+      (##sys#error 'u16vector-set! "argument may not be negative" y))
+    (check-range i 0 len 'u16vector-set!)
+    (##core#inline "C_u_i_u16vector_set" x i y)))
+
+(define (s16vector-set! x i y)
+  (##sys#check-structure x 's16vector 's16vector-set!)
+  (let ((len (##core#inline "C_u_i_16vector_length" x)))
+    (##sys#check-exact y 's16vector-set!)
+    (check-range i 0 len 's16vector-set!)
+    (##core#inline "C_u_i_s16vector_set" x i y)))
+
+(define (u32vector-set! x i y)
+  (##sys#check-structure x 'u32vector 'u32vector-set!)
+  (let ((len (##core#inline "C_u_i_32vector_length" x)))
+    (##sys#check-exact y 'u32vector-set!)
+    (cond ((fx< y 0)
+	   (##sys#error 'u32vector-set! "argument may not be negative" y) )
+	  ((not (##sys#fits-in-unsigned-int? y))
+	   (##sys#error 'u32vector-set! "argument exceeds integer range" y) ) )
+    (check-range i 0 len 'u32vector-set!)
+    (##core#inline "C_u_i_u32vector_set" x i y)))
+
+(define (s32vector-set! x i y)
+  (##sys#check-structure x 's32vector 's32vector-set!)
+  (let ((len (##core#inline "C_u_i_32vector_length" x)))
+    (##sys#check-exact y 's32vector-set!)
+    (unless (##sys#fits-in-int? y)
+      (##sys#error 's32vector-set! "argument exceeds integer range" y) )
+    (check-range i 0 len 's32vector-set!)
+    (##core#inline "C_u_i_s32vector_set" x i y)))
+
+(define (f32vector-set! x i y)
+  (##sys#check-structure x 'f32vector 'f32vector-set!)
+  (let ((len (##core#inline "C_u_i_32vector_length" x)))
+    (##sys#check-number y 'f32vector-set!)
+    (check-range i 0 len 'f32vector-set!)
+    (##core#inline
+     "C_u_i_f32vector_set"
+     x i 
+     (if (##core#inline "C_blockp" y)
+	 y
+	 (##sys#exact->inexact y)))))	;XXX use faster unsafe variant
+
+(define (f64vector-set! x i y)
+  (##sys#check-structure x 'f64vector 'f64vector-set!)
+  (let ((len (##core#inline "C_u_i_64vector_length" x)))
+    (##sys#check-number y 'f64vector-set!)
+    (check-range i 0 len 'f64vector-set!)
+    (##core#inline
+     "C_u_i_f64vector_set"
+     x i 
+     (if (##core#inline "C_blockp" y)
+	 y
+	 (##sys#exact->inexact y)))))	;XXX as above
+
+(define u8vector-ref
+  (getter-with-setter
+   (lambda (x i)
+     (##sys#check-structure x 'u8vector 'u8vector-ref)
+     (let ((len (##core#inline "C_u_i_s8vector_length" x)))
+       (check-range i 0 len 'u8vector-ref)
+       (##core#inline "C_u_i_u8vector_ref" x i)))
+   u8vector-set!
+   "(u8vector-ref v i)"))
+
+(define s8vector-ref
+  (getter-with-setter
+   (lambda (x i)
+     (##sys#check-structure x 's8vector 's8vector-ref)
+     (let ((len (##core#inline "C_u_i_s8vector_length" x)))
+       (check-range i 0 len 's8vector-ref)
+       (##core#inline "C_u_i_s8vector_ref" x i)))
+   u8vector-set!
+   "(s8vector-ref v i)"))
+
+(define u16vector-ref
+  (getter-with-setter
+   (lambda (x i)
+     (##sys#check-structure x 'u16vector 'u16vector-ref)
+     (let ((len (##core#inline "C_u_i_s16vector_length" x)))
+       (check-range i 0 len 'u16vector-ref)
+       (##core#inline "C_u_i_u16vector_ref" x i)))
+   u16vector-set!
+   "(u16vector-ref v i)"))
+
+(define s16vector-ref
+  (getter-with-setter
+   (lambda (x i)
+     (##sys#check-structure x 's16vector 's16vector-ref)
+     (let ((len (##core#inline "C_u_i_s16vector_length" x)))
+       (check-range i 0 len 's16vector-ref)
+       (##core#inline "C_u_i_s16vector_ref" x i)))
+   s16vector-set!
+   "(s16vector-ref v i)"))
+   
+(define u32vector-ref
+  (getter-with-setter
+   (lambda (x i)
+     (##sys#check-structure x 'u32vector 'u32vector-ref)
+     (let ((len (##core#inline "C_u_i_u32vector_length" x)))
+       (check-range i 0 len 'u32vector-ref)
+       (##core#inline_allocate ("C_a_i_u32vector_ref" 4) x i)))
+   u32vector-set!
+   "(u32vector-ref v i)"))
+
+(define s32vector-ref
+  (getter-with-setter
+   (lambda (x i)
+     (##sys#check-structure x 's32vector 's32vector-ref)
+     (let ((len (##core#inline "C_u_i_s32vector_length" x)))
+       (check-range i 0 len 's32vector-ref)
+       (##core#inline_allocate ("C_a_i_s32vector_ref" 4) x i)))
+   s32vector-set!
+   "(s32vector-ref v i)"))
+
+(define f32vector-ref
+  (getter-with-setter
+   (lambda (x i)
+     (##sys#check-structure x 'f32vector 'f32vector-ref)
+     (let ((len (##core#inline "C_u_i_f32vector_length" x)))
+       (check-range i 0 len 'f32vector-ref)
+       (##core#inline_allocate ("C_a_i_f32vector_ref" 4) x i)))
+   f32vector-set!
+   "(f32vector-ref v i)"))
+
+(define f64vector-ref
+  (getter-with-setter
+   (lambda (x i)
+     (##sys#check-structure x 'f64vector 'f64vector-ref)
+     (let ((len (##core#inline "C_u_i_8vector_length" x)))
+       (check-range i 0 len 'f64vector-ref)
+       (##core#inline_allocate ("C_a_i_f64vector_ref" 4) x i)))
+   f64vector-set!
+   "(f64vector-ref v i)"))
 
 
 ;;; Basic constructors:
@@ -247,7 +277,8 @@ EOF
   (set! release-number-vector
     (lambda (v)
       (if (and (##sys#generic-structure? v)
-	       (memq (##sys#slot v 0) '(u8vector u16vector s8vector s16vector u32vector s32vector f32vector f64vector)) )
+	       (memq (##sys#slot v 0)
+		     '(u8vector u16vector s8vector s16vector u32vector s32vector f32vector f64vector)) )
 	  (ext-free v)
 	  (##sys#error 'release-number-vector "bad argument type - not a number vector" v)) ) )
 
@@ -347,7 +378,9 @@ EOF
   (set! make-f64vector
     (lambda (len #!optional (init #f)  (ext? #f) (fin #t))
       (##sys#check-exact len 'make-f64vector)
-      (let ((v (##sys#make-structure 'f64vector (alloc 'make-f64vector (##core#inline "C_fixnum_shift_left" len 3) ext?))))
+      (let ((v (##sys#make-structure
+		'f64vector
+		(alloc 'make-f64vector (##core#inline "C_fixnum_shift_left" len 3) ext?))))
 	(when (and ext? fin?) (set-finalizer! v ext-free))
 	(if (not init)
 	    v
@@ -357,33 +390,36 @@ EOF
 		(set! init (exact->inexact init)) )
 	      (do ((i 0 (##core#inline "C_fixnum_plus" i 1)))
 		  ((##core#inline "C_fixnum_greater_or_equal_p" i len) v)
-		(##sys#f64vector-set! v i init) ) ) ) ) ) ) )
+		(##core#inline "C_u_i_f64vector_set" v i init) ) ) ) ) ) ) )
 
 
 ;;; Creating vectors from a list:
 
-(let ()
-
-  (define (init make set loc)
-    (lambda (lst)
-      (##sys#check-list lst loc)
-      (let* ((n (length lst))
-	     (v (make n)) )
-	(do ((p lst (##core#inline "C_slot" p 1))
-	     (i 0 (##core#inline "C_fixnum_plus" i 1)) )
-	    ((##core#inline "C_eqp" p '()) v)
-	  (if (and (##core#inline "C_blockp" p) (##core#inline "C_pairp" p))
-	      (set v i (##core#inline "C_slot" p 0))
-	      (##sys#error-not-a-proper-list lst) ) ) ) ) )
-
-  (set! list->u8vector (init make-u8vector u8vector-set! 'list->u8vector))
-  (set! list->s8vector (init make-s8vector s8vector-set! 'list->s8vector))
-  (set! list->u16vector (init make-u16vector u16vector-set! 'list->u16vector))
-  (set! list->s16vector (init make-s16vector s16vector-set! 'list->s16vector))
-  (set! list->u32vector (init make-u32vector u32vector-set! 'list->u32vector))
-  (set! list->s32vector (init make-s32vector s32vector-set! 'list->s32vector))
-  (set! list->f32vector (init make-f32vector f32vector-set! 'list->f32vector))
-  (set! list->f64vector (init make-f64vector f64vector-set! 'list->f64vector)) )
+(define-syntax (list->XXXvector x r c)
+  (let* ((tag (##sys#strip-syntax (cadr x)))
+	 (name (symbol-append 'list-> tag))
+	 (make (symbol-append 'make- tag)))
+    `(define ,name
+       (let ((,make ,make))
+	 (lambda (lst)
+	   (##sys#check-list lst ',tag)
+	   (let* ((n (##core#inline "C_i_length" lst))
+		  (v (,make n)) )
+	     (do ((p lst (##core#inline "C_slot" p 1))
+		  (i 0 (##core#inline "C_fixnum_plus" i 1)) )
+		 ((##core#inline "C_eqp" p '()) v)
+	       (if (and (##core#inline "C_blockp" p) (##core#inline "C_pairp" p))
+		   (,(symbol-append tag '-set!) v i (##core#inline "C_slot" p 0))
+		   (##sys#error-not-a-proper-list lst) ) ) ) )))))
+
+(list->XXXvector u8vector)
+(list->XXXvector s8vector)
+(list->XXXvector u16vector)
+(list->XXXvector s16vector)
+(list->XXXvector u32vector)
+(list->XXXvector s32vector)
+(list->XXXvector f32vector)
+(list->XXXvector f64vector)
 
 
 ;;; More constructors:
@@ -423,25 +459,30 @@ EOF
 
 ;;; Creating lists from a vector:
 
-(let ()
-
-  (define (init tag length ref)
-    (lambda (v)
-      (let ((len (length v)))
-	(let loop ((i 0))
-	  (if (fx>= i len)
-	      '()
-	      (cons (ref v i)
-		    (loop (fx+ i 1)) ) ) ) ) ) )
-
-  (set! u8vector->list (init 'u8vector u8vector-length ##sys#u8vector-ref))
-  (set! s8vector->list (init 's8vector s8vector-length ##sys#s8vector-ref))
-  (set! u16vector->list (init 'u16vector u16vector-length ##sys#u16vector-ref))
-  (set! s16vector->list (init 's16vector s16vector-length ##sys#s16vector-ref))
-  (set! u32vector->list (init 'u32vector u32vector-length ##sys#u32vector-ref))
-  (set! s32vector->list (init 's32vector s32vector-length ##sys#s32vector-ref))
-  (set! f32vector->list (init 'f32vector f32vector-length ##sys#f32vector-ref))
-  (set! f64vector->list (init 'f64vector f64vector-length ##sys#f64vector-ref)) )
+(define-syntax (XXXvector->list x r c)
+  (let* ((tag (##sys#strip-syntax (cadr x)))
+	 (alloc? (pair? (cddr x)))
+	 (name (symbol-append tag '->list)))
+    `(define (,name v)
+       (##sys#check-structure v ',tag ',name)
+       (let ((len (##core#inline ,(conc "C_u_i_" tag "_length") v)))
+	 (let loop ((i 0))
+	   (if (fx>= i len)
+	       '()
+	       (cons 
+		,(if alloc?
+		     `(##core#inline_allocate (,(conc "C_a_i_" tag "_ref") 4) v i)
+		     `(##core#inline ,(conc "C_u_i_" tag "_ref") v i))
+		(loop (fx+ i 1)) ) ) ) ) ) ) )
+
+(XXXvector->list u8vector)
+(XXXvector->list s8vector)
+(XXXvector->list u16vector)
+(XXXvector->list s16vector)
+(XXXvector->list u32vector #t)
+(XXXvector->list s32vector #t)
+(XXXvector->list f32vector #t)
+(XXXvector->list f64vector #t)
 
 
 ;;; Predicates:
@@ -458,76 +499,76 @@ EOF
 
 ;;; Accessing the packed bytevector:
 
-(let ()
-
-  (define (pack tag loc)
-    (lambda (v)
-      (##sys#check-structure v tag loc)
-      (##sys#slot v 1) ) )
-
-  (define (pack-copy tag loc)
-    (lambda (v)
-      (##sys#check-structure v tag loc)
-      (let* ((old (##sys#slot v 1))
-	     (new (##sys#make-blob (##sys#size old))))
-	(##core#inline "C_copy_block" old new) ) ) )
-
-  (define (unpack tag sz loc)
-    (lambda (str)
-      (##sys#check-byte-vector str loc)
-      (let ([len (##sys#size str)])
-	(if (or (eq? #t sz)
-		(eq? 0 (##core#inline "C_fixnum_modulo" len sz)))
-	    (##sys#make-structure tag str)
-	    (##sys#error loc "blob does not have correct size for packing" tag len sz) ) ) ) )
-
-  (define (unpack-copy tag sz loc)
-    (lambda (str)
-      (##sys#check-byte-vector str loc)
-      (let* ((len (##sys#size str))
-	     (new (##sys#make-blob len)))
-	(if (or (eq? #t sz)
-		(eq? 0 (##core#inline "C_fixnum_modulo" len sz)))
-	    (##sys#make-structure
-	     tag
-	     (##core#inline "C_copy_block" str new) )
-	    (##sys#error loc "blob does not have correct size for packing" tag len sz) ) ) ) )
-
-  (set! u8vector->blob/shared (pack 'u8vector 'u8vector->blob/shared))
-  (set! s8vector->blob/shared (pack 's8vector 's8vector->blob/shared))
-  (set! u16vector->blob/shared (pack 'u16vector 'u16vector->blob/shared))
-  (set! s16vector->blob/shared (pack 's16vector 's16vector->blob/shared))
-  (set! u32vector->blob/shared (pack 'u32vector 'u32vector->blob/shared))
-  (set! s32vector->blob/shared (pack 's32vector 's32vector->blob/shared))
-  (set! f32vector->blob/shared (pack 'f32vector 'f32vector->blob/shared))
-  (set! f64vector->blob/shared (pack 'f64vector 'f64vector->blob/shared))
-
-  (set! u8vector->blob (pack-copy 'u8vector 'u8vector->blob))
-  (set! s8vector->blob (pack-copy 's8vector 's8vector->blob))
-  (set! u16vector->blob (pack-copy 'u16vector 'u16vector->blob))
-  (set! s16vector->blob (pack-copy 's16vector 's16vector->blob))
-  (set! u32vector->blob (pack-copy 'u32vector 'u32vector->blob))
-  (set! s32vector->blob (pack-copy 's32vector 's32vector->blob))
-  (set! f32vector->blob (pack-copy 'f32vector 'f32vector->blob))
-  (set! f64vector->blob (pack-copy 'f64vector 'f64vector->blob))
-
-  (set! blob->u8vector/shared (unpack 'u8vector #t 'blob->u8vector/shared))
-  (set! blob->s8vector/shared (unpack 's8vector #t 'blob->s8vector/shared))
-  (set! blob->u16vector/shared (unpack 'u16vector 2 'blob->u16vector/shared))
-  (set! blob->s16vector/shared (unpack 's16vector 2 'blob->s16vector/shared))
-  (set! blob->u32vector/shared (unpack 'u32vector 4 'blob->u32vector/shared))
-  (set! blob->s32vector/shared (unpack 's32vector 4 'blob->s32vector/shared))
-  (set! blob->f32vector/shared (unpack 'f32vector 4 'blob->f32vector/shared))
-  (set! blob->f64vector/shared (unpack 'f64vector 8 'blob->f64vector/shared))
-
-  (set! blob->u8vector (unpack-copy 'u8vector #t 'blob->u8vector))
-  (set! blob->s8vector (unpack-copy 's8vector #t 'blob->s8vector))
-  (set! blob->u16vector (unpack-copy 'u16vector 2 'blob->u16vector))
-  (set! blob->s16vector (unpack-copy 's16vector 2 'blob->s16vector))
-  (set! blob->u32vector (unpack-copy 'u32vector 4 'blob->u32vector))
-  (set! blob->s32vector (unpack-copy 's32vector 4 'blob->s32vector))
-  (set! blob->f32vector (unpack-copy 'f32vector 4 'blob->f32vector))
-  (set! blob->f64vector (unpack-copy 'f64vector 8 'blob->f64vector)) )
+(declare (hide pack pack-copy unpack unpack-copy))
+
+(define (pack tag loc)
+  (lambda (v)
+    (##sys#check-structure v tag loc)
+    (##sys#slot v 1) ) )
+
+(define (pack-copy tag loc)
+  (lambda (v)
+    (##sys#check-structure v tag loc)
+    (let* ((old (##sys#slot v 1))
+	   (new (##sys#make-blob (##sys#size old))))
+      (##core#inline "C_copy_block" old new) ) ) )
+
+(define (unpack tag sz loc)
+  (lambda (str)
+    (##sys#check-byte-vector str loc)
+    (let ([len (##sys#size str)])
+      (if (or (eq? #t sz)
+	      (eq? 0 (##core#inline "C_fixnum_modulo" len sz)))
+	  (##sys#make-structure tag str)
+	  (##sys#error loc "blob does not have correct size for packing" tag len sz) ) ) ) )
+
+(define (unpack-copy tag sz loc)
+  (lambda (str)
+    (##sys#check-byte-vector str loc)
+    (let* ((len (##sys#size str))
+	   (new (##sys#make-blob len)))
+      (if (or (eq? #t sz)
+	      (eq? 0 (##core#inline "C_fixnum_modulo" len sz)))
+	  (##sys#make-structure
+	   tag
+	   (##core#inline "C_copy_block" str new) )
+	  (##sys#error loc "blob does not have correct size for packing" tag len sz) ) ) ) )
+
+(define u8vector->blob/shared (pack 'u8vector 'u8vector->blob/shared))
+(define s8vector->blob/shared (pack 's8vector 's8vector->blob/shared))
+(define u16vector->blob/shared (pack 'u16vector 'u16vector->blob/shared))
+(define s16vector->blob/shared (pack 's16vector 's16vector->blob/shared))
+(define u32vector->blob/shared (pack 'u32vector 'u32vector->blob/shared))
+(define s32vector->blob/shared (pack 's32vector 's32vector->blob/shared))
+(define f32vector->blob/shared (pack 'f32vector 'f32vector->blob/shared))
+(define f64vector->blob/shared (pack 'f64vector 'f64vector->blob/shared))
+
+(define u8vector->blob (pack-copy 'u8vector 'u8vector->blob))
+(define s8vector->blob (pack-copy 's8vector 's8vector->blob))
+(define u16vector->blob (pack-copy 'u16vector 'u16vector->blob))
+(define s16vector->blob (pack-copy 's16vector 's16vector->blob))
+(define u32vector->blob (pack-copy 'u32vector 'u32vector->blob))
+(define s32vector->blob (pack-copy 's32vector 's32vector->blob))
+(define f32vector->blob (pack-copy 'f32vector 'f32vector->blob))
+(define f64vector->blob (pack-copy 'f64vector 'f64vector->blob))
+
+(define blob->u8vector/shared (unpack 'u8vector #t 'blob->u8vector/shared))
+(define blob->s8vector/shared (unpack 's8vector #t 'blob->s8vector/shared))
+(define blob->u16vector/shared (unpack 'u16vector 2 'blob->u16vector/shared))
+(define blob->s16vector/shared (unpack 's16vector 2 'blob->s16vector/shared))
+(define blob->u32vector/shared (unpack 'u32vector 4 'blob->u32vector/shared))
+(define blob->s32vector/shared (unpack 's32vector 4 'blob->s32vector/shared))
+(define blob->f32vector/shared (unpack 'f32vector 4 'blob->f32vector/shared))
+(define blob->f64vector/shared (unpack 'f64vector 8 'blob->f64vector/shared))
+
+(define blob->u8vector (unpack-copy 'u8vector #t 'blob->u8vector))
+(define blob->s8vector (unpack-copy 's8vector #t 'blob->s8vector))
+(define blob->u16vector (unpack-copy 'u16vector 2 'blob->u16vector))
+(define blob->s16vector (unpack-copy 's16vector 2 'blob->s16vector))
+(define blob->u32vector (unpack-copy 'u32vector 4 'blob->u32vector))
+(define blob->s32vector (unpack-copy 's32vector 4 'blob->s32vector))
+(define blob->f32vector (unpack-copy 'f32vector 4 'blob->f32vector))
+(define blob->f64vector (unpack-copy 'f64vector 8 'blob->f64vector))
 
 
 ;;; Read syntax:
@@ -576,13 +617,15 @@ EOF
 
 ;;; Subvectors:
 
+(declare (hide subvector))
+
 (define (subvector v t es from to loc)
   (##sys#check-structure v t loc)
   (let* ([bv (##sys#slot v 1)]
 	 [len (##sys#size bv)]
 	 [ilen (##core#inline "C_u_fixnum_divide" len es)] )
-    (##sys#check-range from 0 (fx+ ilen 1) loc)
-    (##sys#check-range to 0 (fx+ ilen 1) loc)
+    (check-range from 0 (fx+ ilen 1) loc)
+    (check-range to 0 (fx+ ilen 1) loc)
     (let* ([size2 (fx* es (fx- to from))]
 	   [bv2 (##sys#allocate-vector size2 #t #f #t)] )
       (##core#inline "C_string_to_bytevector" bv2)
@@ -599,13 +642,15 @@ EOF
 (define (subf32vector v from to) (subvector v 'f32vector 4 from to 'subf32vector))
 (define (subf64vector v from to) (subvector v 'f64vector 8 from to 'subf64vector))
 
-(define (write-u8vector v #!optional (port ##sys#standard-output) (from 0) (to (u8vector-length v)))
+(define (write-u8vector v #!optional (port ##sys#standard-output) (from 0)
+			(to (u8vector-length v)))
   (##sys#check-structure v 'u8vector 'write-u8vector)
   (##sys#check-port port 'write-u8vector)
-  (let ((buf (##sys#slot v 1)))
-    (do ((i from (fx+ i 1)))
-	((fx>= i to))
-      (##sys#write-char-0 (integer->char (##core#inline "C_u8peek" buf i)) port) ) ) )
+  (do ((i from (fx+ i 1)))
+      ((fx>= i to))
+    (##sys#write-char-0 
+     (integer->char (##core#inline "C_u_i_u8vector_ref" v i))
+     port) ) )
 
 (define (read-u8vector! n dest #!optional (port ##sys#standard-input) (start 0))
   (##sys#check-port port 'read-u8vector!)
diff --git a/srfi-69.scm b/srfi-69.scm
index 14aac7ea..5225eab9 100644
--- a/srfi-69.scm
+++ b/srfi-69.scm
@@ -808,7 +808,8 @@
 		        (if (test key (##sys#slot pare 0))
 			    (##sys#slot pare 1)
 			    (loop (##sys#slot bucket 1)) ) ) ) ) ) ) ) ) )
-   hash-table-set!) )
+   hash-table-set!
+   "(hash-table-ref ht key . def)") )
 
 (define hash-table-ref/default
   (let ([core-eq? eq?])
diff --git a/types.db b/types.db
index 0f5378f5..2f3bd29e 100644
--- a/types.db
+++ b/types.db
@@ -351,7 +351,7 @@
 (get-output-string (procedure get-output-string (port) string))
 (get-properties (procedure get-properties (symbol list) symbol * list))
 (getenv deprecated)
-(getter-with-setter (procedure getter-with-setter (procedure procedure) procedure))
+(getter-with-setter (procedure getter-with-setter (procedure procedure #!optional string) procedure))
 (implicit-exit-handler (procedure implicit-exit-handler (#!optional procedure) procedure))
 (keyword->string (procedure keyword->string (symbol) string))
 (keyword-style (procedure keyword-style (#!optional *) *))
Trap