世界線航跡蔵

Mad web programmerのYuguiが技術ネタや日々のあれこれをお送りします。

2006年12月09日

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

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

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

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

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

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

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

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

namespace

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

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

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

トラックバック

http://yugui.jp/articles/564/ping
Procを自然に呼び出す方法の一案 (Hello, world!)
yuguiさんの記事「Procの暗黙の呼び出しとselector namespace」にトラックバック。 Procオブジェクトをなるべく普通のメソッドと同じ方法で呼び出す方法として、 以下のようにProcを呼び出す方法を考えてみました。 require 'rubygems' require 'active_support...

コメント

blog comments powered by Disqus

ご案内

前の記事
次の記事

タグ一覧

過去ログ

  1. 2016年07月
  2. 2016年01月
  3. 2015年09月
  4. 2015年08月
  5. 過去ログ一覧

フィード

フィードとは

その他

Powered by "rhianolethe" the blog system