In article <20020307062002.646B557D / helium.ruby-lang.org>,
  "K.Kosako" <kosako / sofnec.co.jp> writes:

> look-behind機能を追加するときに、それも少しだけ考えたんですが、
> s++ を s += stepにしただけでも速度に響くと思ったので。

In article <20020307064123.2B8FD1A2 / sharui.nakada.kanuma.tochigi.jp>,
  nobu.nakada / nifty.ne.jp writes:

> 「一文字戻す」という操作が実は結構コストが高いというのが問題に
> なりそうな気がします。UTF-8や、EUCでもすでに文字境界にあってい
> る場合などはかなり軽減できるはずですが、SJISでは無理でしょう。
> いや、一度文字境界を検出した先頭の位置を覚えておけばできるかな?

look-behind の使用頻度は低いので、速度はあんまり問題にならないような気
がします。

それでも気になる場合でも、やりかたはいろいろある気もします。

s++ を s+= step に... というあたりは適当に(C の)マクロでコードを複製し
て、コンパイラの最適化をちょっと期待すれば速度は落ちない実装が可能でしょ
う。

また「一文字戻す」というのがコストが高いというのもわかりますが、うまく
やればオーダまでは落ちない実装が可能だと思います。例えば、文字列のある
場所から左に文字境界を探していって、見つかったところまでを反転させた文
字列を作ってしまうとか。
(覚えておくのが先頭の位置だけだとオーダが落ちてしまうと思う。)

いずれにしても engine からの文字列のアクセスを抽象化してあっていろんな
アクセス法を(静的に)切替えられればどうにでもなるという気がしますが...

multibyte encoding の解釈部分しか切替えられないんでしょうか?
(ソースを読んでなくててきとうなコメントですいません。)

> あとは、back-referenceとか。

ふむ。これは本質的ですね。気づいていませんでした。perl は禁止している
ようですが。

look-behind の場合は \1 は forward-reference になる... というのは良く
ないかな? いや、loop の中とかにあると look-behind でなくても右側で
capture したものになることもあるからそれでもいいのかもしれない...
-- 
[田中 哲][たなか あきら][Tanaka Akira]
「ふえろ! わかめちゃん作戦です$(C⊇」(Little Worker, 桂遊生丸)