あおきです。

  In mail "[ruby-list:20291] Re: RD with method index (again)"
    Toshiro Kuwabara <toshirok / yb3.so-net.ne.jp> wrote:

> Toshです。

> >next_token の中で、shift ではなくインデックスを使って指定するように
> >すればうまくいきませんか?

> あ、いや、そういう意味ではなくて、
>   * 現在のRDtoolのパーサはTextBlockに還元された時点でインライン用の
>     パーサに渡してインラインをパースしている。
>   * したがって、インラインをパースしているときには、IO#linenoの値は
>     TextBlockの最後の行。
>   * つまりインラインがその途中でエラーになるとエラー行表示はちょっと
>     大きい値を返して来ることに。
> ということです。

すみません、簡略化しすぎました。

まず、前提として delegate は遅いです。
通常の使い方なら全く問題ないですが、今回のように大量に生成され
大量に演算対象になる場合は速度的に厳しいので、これは避けたほうが
いいと思います。

また、現在の実装だと文字列を足したり切ったりしているため、
delegate そのままだと新しく生成した文字列が全部普通の String に
なってしまいますから、結局 + や [] を再定義する必要があります。
また $' などもあるのでこれはさらに明示的に生成する必要があります。
つまり、今回のことに関して言えば delegate は速度も遅くなるし
手間も減らないということです。

しかし専用にクラスを作ることを考えると、おそらくインデックスを
ごちゃごちゃ操作しても手間と速度はかわらないだろうと推測しました。
ついでに、インデックスを保持しておくと行番号も得られるので
お得度アップかもしれないし。
行のずれはブロックパーザとインラインパーザのインデックスを
引き算すればたぶん補正できるんじゃないかなーという希望的観測を
してました。
(もちろん、インデックスのかわりに IO.lineno を使っても同じですが。)

ところが、そんなこと言ってるあいだに実装してみたんですが、
=begin =end の外のことを全然考えてないというとんでもないミスに
気付きました。
というわけで、結局専用にクラスを作るのが一番いいかもしれません。

# 混乱させてしまってすみませんでした。
-------------------------------------------------------------------
あおきみねろう
delete_at(i,len) も忘れてないんだけど書いてる時間がない…