##こんな感じのスクリプトですが、遅延リストの頭をつかむようなことはしてないと思うんだけどなー。
#うむ、ぱっと見、掴んでるようには見えない。運が悪いとfalse pointerが遅延ストリームの元の方を指しちゃってるというケースはありえる。要分析だな。
#あ、待てよ。peg-parser->generatorでsrcをlseqに直してるけど、この最初のsはずっと掴まれたままになるんじゃなかろうか。
#お...
#generateの中で外側のsをイテレーションの度に破壊的変更すべきかもしれない。
##試します。
#今のところメモリ使用量が爆発してはいません。gcが重いのか、時々出力が止まりますが。
#勘違いでした。やはりメモリ使用量はどんどん増えていきます。
#(raise (construct-peg-parser-error r v s s1))
#ここで掴んでたりする?
#関係ないかなぁ
#あと
#--- a/ext/peg/peg.scm
+++ b/ext/peg/peg.scm
@@ -244,15 +244,14 @@
;; API
;; Returns a generator
(define (peg-parser->generator parser src)
- (let1 s (%->lseq src)
- (generate (^[yield]
- (let loop ([s s])
- (receive (r v s1) (parser s)
- (if (parse-success? r)
+ (generate (^[yield]
+ (let loop ([s (%->lseq src)])
+ (receive (r v s1) (parser s)
+ (if (parse-success? r)
(unless (eof-object? v)
(yield (rope-finalize v))
(loop s1))
- (raise (construct-peg-parser-error r v s s1)))))))))
+ (raise (construct-peg-parser-error r v s s1))))))))
;;;============================================================
;;; Lazily-constructed string
#これじゃダメなのかなぁ、と思いました。
#(raise (construct-peg-parser-error r v s s1))
#これは関係ないですね。
#すみません。
#うーん。こちらのパッチでも変わらない気がする
#結局ジェネレータ使うのを断念しました。
#レコード単位ごとに手書きのパーザで文字列としてフェッチして、そいつをpegパーザでパーズしました。これなら、メモリは完全に固定サイズで動いています。
##遅延ストリームは見通しがよくて魅力的ですけど、使いこなすのはなかなか難しいですね。
#話としては同じことかなあ>パッチ。ちょっとした違いとして、後者だとsrcへの参照が保持されるってのがあるけど、今はsrcに渡ってるのはジェネレータだしなあ。どっかが頭を抱えてるのは確かだと思うんでこちらでも実験してみます。