string->stream
文字列→ストリーム(バックトラック機能つき)
(use gauche.uvector) ; string->u8vector (define *eof* (read-from-string "")) (define *undef* (if #f #f)) (define (string->stream string) (let* ((buf (string->u8vector string)) (len (u8vector-length buf)) (pos 0)) (define (set-pos! new-pos) (set! pos (cond ((< new-pos 0) 0) ((< new-pos len) new-pos) ; [0,len) (else len)))) (define (make-backtrack-proc pos) (lambda () (set-pos! pos))) (define (first-char) (if (< pos len) (let1 ch (u8vector-ref buf pos) (set! pos (+ pos 1)) (integer->char ch)) *eof*)) (lambda (m) (case m ((first-char) (first-char)) ((set-pos) set-pos!) ((at-the-end?) (= pos len)) ((rewind) (set-pos! 0)) ((backtrack-proc) (make-backtrack-proc pos)) (else *undef*))) ))
2007年11月06日(火) 00:21:31 Modified by naoya_t