(library (ikarus strings) (export string-ref make-string) (import (except (ikarus) string-ref make-string) (only (scheme) $string-ref $fx+ $fx= $fx<= $fx< $string-length $make-string $string-set!)) (define (string-ref s i) (unless (string? s) (error 'string-ref "~s is not a string" s)) (unless (fixnum? i) (error 'string-ref "~s is not a valid index" i)) (unless (and ($fx< i ($string-length s)) ($fx<= 0 i)) (error 'string-ref "index ~s is out of range for ~s" i s)) ($string-ref s i)) (define make-string (let () (define fill! (lambda (s i n c) (cond [($fx= i n) s] [else ($string-set! s i c) (fill! s ($fx+ i 1) n c)]))) (define make-string (case-lambda [(n) (unless (and (fixnum? n) (fx>= n 0)) (error 'make-string "~s is not a valid length" n)) ($make-string n)] [(n c) (unless (and (fixnum? n) (fx>= n 0)) (error 'make-string "~s is not a valid length" n)) (unless (char? c) (error 'make-string "~s is not a character" c)) (fill! ($make-string n) 0 n c)])) make-string)) )