From: Toshiro Kuwabara Date: 2000-01-20T23:59:41+09:00 Subject: [ruby-list:20303] Re: RD with method index (again) Toshです。 In message "[ruby-list:20297] Re: RD with method index (again)" on 00/01/20, Minero Aoki writes: >> >next_token の中で、shift ではなくインデックスを使って指定するように >> >すればうまくいきませんか? >すみません、簡略化しすぎました。 > >まず、前提として delegate は遅いです。 >通常の使い方なら全く問題ないですが、今回のように大量に生成され >大量に演算対象になる場合は速度的に厳しいので、これは避けたほうが >いいと思います。 ふむふむ。 >また、現在の実装だと文字列を足したり切ったりしているため、 >delegate そのままだと新しく生成した文字列が全部普通の String に >なってしまいますから、結局 + や [] を再定義する必要があります。 >また $' などもあるのでこれはさらに明示的に生成する必要があります。 >つまり、今回のことに関して言えば delegate は速度も遅くなるし >手間も減らないということです。 う〜む、なるほど。わかりました、なかなかそう簡単にもいかないのですね。 Stringのメソッド呼ぶ毎にメソッド呼出のコストが2倍くらいになるとなかな か無視もできないかんじですね。 今のRubyはStringのサブクラスってインスタンス変数持てるんでしたっけ? 継承で、って手もある? >しかし専用にクラスを作ることを考えると、おそらくインデックスを >ごちゃごちゃ操作しても手間と速度はかわらないだろうと推測しました。 >ついでに、インデックスを保持しておくと行番号も得られるので >お得度アップかもしれないし。 >行のずれはブロックパーザとインラインパーザのインデックスを >引き算すればたぶん補正できるんじゃないかなーという希望的観測を >してました。 >(もちろん、インデックスのかわりに IO.lineno を使っても同じですが。) > >ところが、そんなこと言ってるあいだに実装してみたんですが、 >=begin =end の外のことを全然考えてないというとんでもないミスに >気付きました。 >というわけで、結局専用にクラスを作るのが一番いいかもしれません。 う〜ん、でもプリプロセッサの方も書き換えれば=begin ... =endの外の行数 もカウントできるのでは?IO#linenoだったら、特に何もしなくてもちゃんと 行を返してくれそうですし。 参考にしたいので、その実装してみたコードというのを見せて頂けるとうれし いです。 ># 混乱させてしまってすみませんでした。 あ、いえいえ、あおきさんのような方にアドバイスいただけるとこちらとして はありがたいです。今後ともよろしくお願いします。(^^ --- Tosh Toshiro Kuwabara