#なるほど、言われてみれば一行読むとかそれ自体オーバーヘッドですね。ポートでバッファリングしているんだし。
#つまり、文字列として処理するよりもジェネレータとして処理したほうがいい場合だったということですか?
#あ、ジェネレータというのは違うか。文字列として読むのでなく、バッファにあるものを一つ一つとっていく=ジェネレータと短絡してしまいました。
#修正前のcsvの実装を読もうとして、よくわからなくて挫折した記憶があります。そのときには性能を出すためにはこういうテクニックがいるのかなあと思っていたのですが・・・・・・事実は小説より奇なりというか面白いものですね。
#skip-ws は改行でも止まる必要がありますね。でないと ,\na,b\n のような場合に次の行まで一つのレコードになってしまいます。
#diff --git a/lib/text/csv.scm b/lib/text/csv.scm
index 2f4f037..cb1f385 100644
--- a/lib/text/csv.scm
+++ b/lib/text/csv.scm
@@ -81,10 +81,11 @@
(define (eor? ch) (or (eof-object? ch) (eqv? ch #\newline)))
(define (start fields)
- (let1 ch (skip-ws (read-char))
+ (let1 ch (read-char)
(cond [(eor? ch) (reverse (cons "" fields))]
[(eqv? ch sep) (start (cons "" fields))]
[(eqv? ch quo) (quoted fields)]
+ [(char-whitespace? ch) (start fields)]
[else (unquoted (list ch) fields)])))
(define (unquoted chs fields)
#skip-ws なくしてこうでいいような。
#あと eor? のテストをひっくり返すとこの間の郵便番号の csv ファイルで 2-3% 速くなるようです。
#まはろ。コミットしました。
#gosh> #/((.)\2)/
*** ERROR: bad regexp syntax in "((.)\\2)"
#バグっぽいです
#む。regexp.cの944行目 if (ctx->grpcount - level < grpno) goto synerr; なんだけどなんでわざわざlevelを引いてるんだっけな。
#自分を含むグループの参照を禁止しようとした? でもlevelじゃそれは実現できないな。どのグループが閉じたかの情報を別に持っとかないとだめなんじゃないかな。