Procの暗黙の呼び出しとselector namespace

RubyにおいてProcやMethodをできるだけ普通のメソッドに近い構文で呼び出すために、まつもとさんもずいぶんと試行錯誤しているというのは 呼び出し可能シリーズ初回 で見たとおり。

で、これを実現するために障害となるのは2つであると認識している。

  • メソッド呼び出しの括弧を省略可能であること
  • 変数とメソッドは名前空間が異なること

主に影響するのは前者かな。そのままでは変数の参照と引数なしのメソッド呼び出しの区別が付かない。これは本来はRubyの長所なのだけれども、殊暗黙呼び出しを実現するということについては障害となる。今さら括弧を必須にするというのはあり得ないし、何かを基準に呼び出しと変数参照を区別しないといけない。

区別の基準だけれども、メソッド呼び出しは実行前に変数参照と区別したい。例えば、変数がポイントしているオブジェクトを見てProcやMethodだったら呼び出しとみなすとする。この方法には色々な問題があるけれども、特に、実行時の状況によってプログラムの意味自体が変わってしまうというのは致命的だ。StringとProcをポイントする可能性がある変数を考えてみれば、その変数を使うのがかなり難しくなるというのが分かるだろう。それに、実行時に毎回、変数一つ一つについて型チェックするのは遅そうだし、拡張性もない。

今は、メソッドと変数参照は名前空間が違うのでParse時に区別が付いている訳だ。より以前に代入が出現しているのは変数で、それ以外はメソッド呼び出しだ。これらはParse時に決定されて、異なる名前空間を検索される。

けれども、メソッド呼び出しは変数とは異なる名前空間を探索する、ということは何かのトリックなしには変数を呼び出しに変換できないということでもある。

namespace

名前空間名前空間と連呼していたら思い出した。ruby-devでずっとselector namespaceが議論されていることを。 前田さんの説明 とか。

ユーザー定義のメソッド名前空間と、デフォルトの名前空間があるわけだ。だったら、これらと並列して、メソッド呼び出しの候補となりうる変数が所属する名前空間をおいたらスマートに解決できんかね。(proc)(a, b)構文よりは、「これは名前空間が違うから」ということで名前空間の切替え構文に統合したほうが綺麗な気がしたんだ。あるいは、特定の名前だけを暗黙に他の名前空間として解釈すように宣言する、レキシカルに影響を与える構文があるとさらに楽かもしれない。

という話を、昨夜夢の中で思い付いた。