[#20227] dyna_vars problem? — Tanaka Akira <akr@...17n.org>

しばらく前から、稀に Ruby が core を吐くという問題を追いかけているので

15 messages 2003/05/19
[#20234] Re: dyna_vars problem? — matz@... (Yukihiro Matsumoto) 2003/05/19

まつもと ゆきひろです

[#20236] Re: dyna_vars problem? — Tanaka Akira <akr@...17n.org> 2003/05/19

In article <1053363181.529491.30320.nullmailer@picachu.netlab.jp>,

[ruby-dev:20211] Re: /()*\1/ =~ ""

From: Tanaka Akira <akr@...17n.org>
Date: 2003-05-19 06:50:40 UTC
List: ruby-dev #20211
In article <1053325303.999559.4220.nullmailer@picachu.netlab.jp>,
  matz@ruby-lang.org (Yukihiro Matsumoto) writes:

> どうせそのうち1.9に一本化されますし、微妙なところにひっかか
> る人も少ないと思うので、手をつけないでも良いのですが、一応。

えぇ。ですから問題は鬼車の挙動が望ましいかどうかですね。

> 鬼車は
>
>   小迫  (2003-05-19 14:34)
>
>   空にしかならない場合は、特別に置き換えをしています。
>   /()*/ ==> /()?/
>
>   一般的に、空になることもある繰り返しは、一回の繰り返し毎に
>   空になったかどうかチェックして、空の場合には繰り返しを終了
>   させます。

よくわかんないです。

「一回の繰り返し毎に空になったかどうかチェックして、空の場合には繰り返
しを終了させます」というのは、私には、繰り返しの最中に中身が空にマッチ
したらそれでもう繰り返さないというように聞こえるのですが、

% ./ruby -rpp -e 'pp /a(?:()|(b))*c\1/.match("abc")'
#<MatchData "abc" "" "b">

というような場合には、() にも (b) にもマッチしています。つまり、中身が
() にマッチしたあと、さらに繰り返して (b) にマッチしているように思いま
す。とすると、私の理解は間違っているわけで、上記の終了させますっていう
のはどいう意味なんでしょう?

# onigd20030514 を install して試しました。

あと、ふと、繰り返しの中身が空文字列にマッチすることによって capture
が起こる場合は、繰り返しの最初にまとめて起こしてしまうのはどうだろうと
思ったりもしましたが、named capture により、それ以前に空でないのが入っ
ていることがあってそれを空にしてしまうことがあるから完全とはいかないか...

うぅむ。(1.8 のように?)繰り返しの中身が空文字列にマッチしたときは無視
される(中身に対して即座にバックトラックがかかる)、というのがいさぎよく
ていいのかなぁ?

Ruby な考え方を思い出してみると、どれが直観的か、ということを考えるべ
きなのかもしれませんが... なんというか状況そのものがなんとも非直観的。
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread