From: Tanaka Akira Date: 2003-07-18T18:08:19+09:00 Subject: [ruby-dev:20725] Re: [Oniguruma] explicit capture In article <5FD2F0CF7F5D7F44B00F36870B9E78B508DE5054@SBG-EX4>, kkosako@softbank.co.jp writes: > 式展開の中に名前が入っていたとしても、同様に扱うとしておいて、 > ローカル変数にならない指定方法を、別に用意するのが良いと思います。 > > 例としては、トップレベル(他のnamed groupで囲まれていない)で定義された > 名前だけがローカル変数になる。 /(?<_>(?...)){0}\g/ ふむ、私としてはここでいうトップレベルを式展開の外側と定義したいところ です。 つまり、現状の式展開のやりかたでいえば、to_s したときに内部は代入の意 味をもたないというような印をつければいいわけで、その印が上のような形と いうやりかたもあるかも知れませんが、どちらかというとオプションのほうが 自然ですかね。 でも、次に、リテラルじゃないのをマッチしたときのことが気になって来まし た。引数としてパターンを渡されて pat =~ str とかやって pat 中に偶然ロー カル変数と同名の named capture が入っててローカル変数が書き換えられちゃっ たら困りますよねぇ。 いろいろ考えていて思ったのですが、結局代入なんだから、なるべく代入での スコープの扱いと同じようにすべきで、同じようにできないところはすっぱり とあきらめるのがいいのかなぁ、という気がしています。 つまりそれなりにレキシカルスコープっぽくしたいということなわけですが。 で、レキシカルスコープだとすれば、リテラルとして書いたところの変数に代 入されるのが筋なわけですが、式展開で組み上げていった中のほうのリテラル を書いたところに代入しても、代入したタイミングで処理を起動できなくて面 白くないので、リテラルを書いてその場でマッチを行うケースだけどうにかす るあたりが落しどころなのではないか、という気がしています。 まぁ、リテラルを書いてその場でマッチを行うケースというのをどう判断する のかも問題ですが。/.../ =~ ... とか when /.../ とかを特別扱いして意味 を付加するか、あるいは /.../ = ... のような新しい構文を導入するか、い ろいろ考えられるし、また、あきらかにこれが一番良いというのも今のところ 考えつかないので難しいところです。 > 先程気づいたのですが、named groupの中で名前に使用できる文字を > あまり制限していなかった('\', '>', ')', NUL以外全て)のですが、 > ローカル変数名に使用できる名前程度に制限しておいたほうが > 良いでしょうか? これは賛成します。 -- [田中 哲][たなか あきら][Tanaka Akira]