KIMURA Shigenobu
skimu****@mac*****
2004年 8月 12日 (木) 10:27:39 JST
私も以前にとある CAD の出力(S-式)を読み込みたくなって 同じような状況になりました。そのときはたまたま読み込みたい データファイルが awk で処理しやすいようにインデントされていたので 適当にダブルクオートでくくったりして逃げました。 On Aug 11, 2004, at 12:19 PM, Kawai Shiro wrote: > うーん、Common Lispのreadtableみたいな仕組みがあれば > 読み込みをカスタマイズできるんですが、現在のGaucheの > readは字句解析部がハードコードされちゃっているので、この > ケースは自前でread相当のものを書くしかないような気がします。 最近 lexer サルしてるのでいい加減リーダを書いてみました。 http://homepage.mac.com/skimu/Gauche/mread.scm サンプルデータ(6Mbytes ほどの一個の S 式) http://homepage.mac.com/skimu/Gauche/sexp.dat.gz 動かしてみると、 % time gosh mread.scm < sexp.dat > /dev/null real 0m19.006s user 0m18.820s sys 0m0.180s % time gosh -e '(write (read))' < sexp.dat > /dev/null real 0m7.444s user 0m7.300s sys 0m0.100s 三倍ちかく遅いです。 Scheme 版以外と頑張ってるじゃないの! と思ったのもつかの間。 % time gosh -e '(read)' < sexp.dat > /dev/null real 0m1.404s user 0m1.340s sys 0m0.060s むむ、gosh は読むだけならこんなに速いの!!?? mread.scm の write をコメントアウトして もう一度実行 % time gosh mread.scm < sexp.dat > /dev/null real 0m18.245s user 0m18.030s sys 0m0.210s あれ? Scheme バージョンは write してもしなくても そんなにかわらない。 read だけなら 10 倍遅いということが。 こんなもの?