;;;; memoized-string.scm -*- Hen -*- ;;;; Kon Lovett, Aug '10 (module memoized-string (;export make-string* *make-string*) (import scheme chicken) (import (only srfi-69 make-hash-table hash-table-ref/default hash-table-set!) (only unicode-utils ascii-codepoint? unicode-make-string) (only type-checks check-natural-fixnum check-char)) (require-library srfi-69 unicode-utils type-checks) ;; Memeoized `make-string' (define (make-string* len #!optional (ch #\space)) (check-natural-fixnum 'make-string* len) (check-char 'make-string* ch) (*make-string* len ch) ) (define *make-string* (let ((+strings+ (make-hash-table eqv?))) (lambda (len ch) (let ((str-hash-table (hash-table-ref/default +strings+ ch #f))) (if str-hash-table (or (hash-table-ref/default str-hash-table len #f) (let ((str (unicode-make-string len ch))) (hash-table-set! str-hash-table len str) ; str-hash-table already member of +strings+ str ) ) (begin (hash-table-set! +strings+ ch (make-hash-table eqv?)) (*make-string* len ch) ) ) ) ) ) ) ) ;module memoized-string