In article <1046613803.268414.3770.nullmailer / picachu.netlab.jp>,
  matz / ruby-lang.org (Yukihiro Matsumoto) writes:

> |  1. subexp callを実装 (Tanaka Akira提案)
> |     呼出し:(?*name)
>
> これはどういうものですか?

たとえば、
  /\A(?<S>|\((?*S)\)(?*S))\z/ =~ s
とすると、つりあったかっこにマッチできるようなものです。
(当然ですがこれは regular ではありません。)

ちなみに /\A(?<S>|\((?*S)\)(?*S))\z/ というのがなぜつりあったかっこに
マッチするかというと、これは

S = '' | '(' S ')' S

という BNF をパターンとして表現したものだからです。
パターン全体を (?<S>...) でくくって S という名前をつけ、... の部分に S
の右辺を (S の出現を (?*S) によって表現して) 展開してあるだけですが。

また、regular なパターンでも、同じパターンをたくさんコピーしないといけ
ない場合に実際にコピーするのでなく (?*name) で共有することによって記述
を簡単にし、さらに使用するメモリを減らすことができます。

例えば、DFA を正規表現に変換すると、爆発的に大きくなることがあるのです
が、(?*name) があるとそういう爆発を防ぐことができます。

ただ、少し試してみると、問題もあるようですね。

% ./ruby -e '/(?<n>|(?*n))+/'
-e:1: [BUG] Segmentation fault
ruby 1.8.0 (2003-02-28) [i686-linux]

というように SEGV が出たり、

% ./ruby -e 'p /\A(?<n>(a(?*n))|)\z/'
-e:1: never ending recursion: /\A(?<n>(a(?*n))|)\z/

というように無限再帰にはならない(と思う)パターンでエラーが出たり。

ついでに書いておくと、(?*name) じゃないですが、

% ./ruby <<'End'
p "abcabc".sub(/(?<n>.*)\g<n>/, '\g<n>')
End
"\\g<n>"
% ./ruby -e '"abcabc".scan(/(?<n>...)\g<n>/) { p $~["n"] }'
-e:1:in `[]': cannot convert String into Integer (TypeError)
        from -e:1
        from -e:1:in `scan'
        from -e:1

というように置換文字列や $~.[] で名前が使えないのはまだ未実装なのだろ
うか、とか思ったりもしています。
-- 
[田中 哲][たなか あきら][Tanaka Akira]