Wiki内検索
最近更新したページ
最新コメント
メニューバー
ここは自由に編集できるエリアです。
タグ
カテゴリー

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




スマートフォン版で見る