Gauche > Archives > 2012/05/27

2012/05/27 00:15:05 UTCnatsutan
#
あと少しですね。
2012/05/27 02:26:01 UTCkaki
#
gosh> (#/.*b/ #`",(make-string 5038)b")
*** ERROR: stack overrun during matching regexp #/.*b/
#
エラーになってしまいます.
2012/05/27 02:50:47 UTCshiro
#
それは現在のregexpエンジンの限界だなあ。NFAエンジンでは #/.*b/ というのは非常に効率が悪い正規表現なので、そもそも長い文字列にマッチさせるべきではないんだけど、golfだと避けがたいかも。#/[^b]*b/ のように前に'b'を含まない式であればずっと効率良くなります。「bはいくつも現れるけど、最後に現れるbまで探したい」というのなら今のGaucheでは明示的にstring-index-rightとか使ってもらうのが推奨。
2012/05/27 03:10:43 UTCkaki
#
golfじゃなく普通に長さ12000くらいの文字列にマッチさせようとしてました.今回は .*? で済むことに気付いたのでそれで回避しました.string-index-right は文字列で検索できないんですね,bの所は実際には数文字あるので…あれ,string-scan-right みたいなものって無いんでしょうか
2012/05/27 03:16:46 UTCshiro
#
あー、string-scan-rightは無いなあ。もともと文字列というのはリストの特殊なもので、右から見るべきではないっていう考えが背景にはあります。でもユーティリティ関数としてstring-scan-rightを作っておくのは良いかも (左から探していって最後のものを返す、という動作)
2012/05/27 03:24:58 UTCkaki
#
文字列だと右から見たいこともあるような気がします.今回も右から見た方が自明だったので .* で書いてました.
2012/05/27 03:33:50 UTCkaki
#
Rubyなら s1.rindex(s2) で済むのに…とか考えてしまいます(世界観の違いはありますが,配列中心だったり).あと上の例も長さ100000でも大丈夫でした.
2012/05/27 03:37:48 UTCshiro
#
「最右マッチを探す」のと「右から見る」はちょっと違うんですね。「最右マッチを探す」のが必要な場面があるのはわかります。「右から見る」はその実装方法のひとつ。
2012/05/27 03:49:57 UTCkaki
#
はい.でも最右マッチを探すなら右から見た方が効率がいいですよね…と思ったけど,右からバイト列で見たらインデックスが分からないしインデックスアクセスだったら遅い…
#
string-scan-right が左から探すというのは,そういうことですか?
#
文字列としてのインデックス,です
2012/05/27 03:56:26 UTCshiro
#
単純文字列なら右から見られるんですが、それは内部的な最適化のひとつで、一般的なイメージとしては文字列はリストみたいに先頭から数珠つなぎになってると考えておいた方がいいんじゃないかな、ってことです。string-scan-rightについては今考えてるんですが、少なくともutf-8なら右から探して困ることはないかも。
2012/05/27 04:03:05 UTCkaki
#
さっきまでちょっとベクタみたいなノリだったことに気付きました.string-scan-rightはshift-jisだと駄目文字の関係で右からだと面倒だったりするんですかね…
2012/05/27 04:08:09 UTCkaki
#
駄目文字というか1バイトの文字か2バイト文字の2バイト目かそのバイト見ただけじゃ区別できなかったと思うので
2012/05/27 05:16:19 UTCshiro
#
はい。ちょい面倒です。あと、例えば単語の境界とかってちゃんとやろうとすると左からスキャンしないとだめだったりとか、わりと高次の操作では左からが前提になることが多いんですよね。
2012/05/27 05:32:53 UTCkaki
#
なるほどー.勉強になりました.
2012/05/27 23:53:53 UTCshiro
#
string-scan-right 足しました。