From: Tanaka Akira Date: 2003-08-01T16:17:46+09:00 Subject: [ruby-dev:21050] Re: [Oniguruma] explicit capture In article <5FD2F0CF7F5D7F44B00F36870B9E78B508DE505A@SBG-EX4>, kkosako@softbank.co.jp writes: > この目的のためだけに新しいprefixを導入するというのは、 > 無理かもしれませんね。 ちょっと必要性が薄いように思います。 > prefixを付けないとすると、田中さんの提案の中で、 > ローカル変数を生成する構文とメソッドの導入が良いと思います。 > > /(?...)/ = "abc" > /(?...)/.vmatch("abc") = に関しては、後から思いついた問題点として = が右辺の値を返すという流 儀に従うと使いにくいものになりそうということがあります。やはりマッチし たかどうかも調べたいですから、真偽値を返して欲しいですよね。 また、vmatch のような(普通の形で呼び出す)メソッドはちょっと私の意図に は沿わないです。 私の意図をまとめ直すと、 * capture したものを $~["name"] を経由せずに直接変数に代入したい /(?...)/ =~ str name = $~["name"] というように name を 3回も書かなきゃいけないのは我慢できそうにない。 番号なら、 /(...)/ =~ str name = $1 というように、繰り返しが無く、短く、$ の数も変わらないわけで、利点が 番号を数えなくていいだけというのはちょっとひきあわない。 * でも、プログラマが意図しない変数に代入されるのは嫌だ var =~ str というように Regexp (の named capture)がリテラルとして見えない時には 変数には代入しないで欲しい。 とくに、ユーザ入力から Regexp を生成したりすると変数を好き勝手にいじ られかねないので少なくともデフォルトでは代入すべきでない。 というものなわけですが、後者の要求を満たそうとすると、どうしてもリテラ ルとそれ以外の式を別に扱う必要があります。そのように式として評価すると 同じ値になるのに異なる扱いをするという仕掛けには、普通のメソッド呼び出 しという形式はあまりに普通すぎて、その特別扱いが違和感を生じるように思 います。 それに対し、= の左辺は評価される式じゃありませんから違和感がないわけで すが、先に述べた通り他の = との返値に関する一貫性の問題があります。 で、もしかしたら、=~ や when が /(?...)/ =~ "abc" case "abc" when /(?...)/ ... end という形で使われた時を特別扱いするのがいいのではなかろうか、という気が して来ました。これらは、形としてはメソッド呼び出しではないので、リテラ ルの特別扱いによる違和感が少ないですし、新しい記法を導入しないので既存 の構文と自然に融合します。 また、ついでにいえば、現在の実装でも、/.../ =~ ... というのは特別扱い されていて再定義が効かないので、再定義が効かなくなったと文句を言われる こともない、というわけで。 -- [田中 哲][たなか あきら][Tanaka Akira]