ratio - rational - irrational

« 急性中耳炎 | Main | Second Life »

2006年12月10日

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

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

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

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

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

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

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

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

* namespace

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

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

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



トラックバック

この記事のトラックバックpingのURL:
http://idm.s9.xrea.com/blog/mt-tb.cgi/562

Ping元:Procを自然に呼び出す方法の一案

概要:
yuguiさんの記事「Procの暗黙の呼び出しとselector namespace」にトラックバック。 Procオブジェクトをなるべく普通のメソッドと同じ方法で呼び出す方法として、 以下のようにProcを呼び出す方法を考えてみました。 require 'rubygems' require 'active_support...
Weblog:
Hello, world!
日時:
2006年12月10日 17:18

コメント

新しくコメントをつける

よくわからない理由により、コメントが即座には反映されないかもしれませんか゛、ボタンを押して元の画面に戻ってきたならたぶん正しく送信されています。




blog操作

検索


カテゴリー

このブログについて

あわせて読みたい

follow yugui at http://twitter.com
© 2006 Yugui

Powered by Movable Type 3.2-ja-2