«前の日記(2006年02月16日) 最新 次の日記(2006年02月18日)» 編集

Matzにっき


2006年02月17日 [長年日記]

_ ご当地バカ百景

よくわかるのは今住んでる島根県と育った鳥取県なのだが、まあ、「くすっ」と笑えるくらいか。

しかし、宍道湖七珍の「すもうあしこし」ってなんだったっけ。

  • す - スズキ
  • も - モロゲエビ (別名テナガエビ)
  • う - ウナギ
  • あ - アマサギ
  • し - シジミ
  • こ - コイ
  • し - シラウオ

...だったかな。Googleするとトップはうちの会社の人だった。

_ [OSS] OSSにとってどのような支援策が必要か?

よしおかさんによる。人財という話になっているようだ。まあ、そうかも。

コネクションは重要だ。が、そのコネクションを上手に活用するのはもっと重要だ。

私は幸い日本のオープンソース界ではたぶんトップレベルのコネクションを持っていると思うのだが、あんまり活用しきれてないなあ。

マレーシアで時間があったら、よしおかさんとそういう話もできるといいな。

_ [Ruby] 定数探索ルール変更

1.9で定数探索のルールを変更した。1.8までの定数探索ルールは

  1. 自クラス
  2. ネスト上外側のクラス(トップレベルを除く)
  3. スーパークラス...Objectまで

だが、これはスーパークラスの定数とスーパークラスの定数がどちらが優先かよくわからない、とか、ネストの外側の定数参照はレキシカルな参照に見えるが実はそうじゃない、とか、あまり気に入らないと思っていたのだ。

新しいルールは以下の通り。

  1. 自クラス
  2. スーパークラス(Objectを除く)
  3. ネスト上外側のクラス

本当はもっと単純なルールにしたかったのだが、結局前と同じくらい複雑になっている。いろいろな局面でもっとも便利なルールを考えていたらこうなってしまった。

このルールの(2)でObjectを除いているのは、 Objectがグローバルな定数の置き場所になっているため。グローバル定数よりはよりスコープの狭いネストの外側の定数を優先したかったため。ネストの一番外側はObjectと決まっているので、このルールで見えるべき定数は全部見える。

探索順序が変わっただけで、探索範囲は減っていないから、定数の名称が重複しない限り問題は発生しない。

標準添付のライブラリの範囲内で問題が起きたのは以下の二ヶ所。

webrick/httpservlet/cgihandler.rb:

class CGIHandler < AbstractServlet
  Ruby = File::join(::Config::CONFIG['bindir'],
                    ::Config::CONFIG['ruby_install_name'])
  Ruby << ::Config::CONFIG['EXEEXT']
  CGIRunner = "\"#{Ruby}\" \"#{Config::LIBDIR}/httpservlet/cgi_runner.rb\""

ここではトップレベルのConfigとWEBrick::Configが混在している。 5行目を以下のように書き換えた。

CGIRunner = "\"#{Ruby}\" \"#{WEBrick::Config::LIBDIR}/httpservlet/cgi_runner.rb\""

よりわかりやすい方向に矯正されたと思う。

もうひとつはresolv.rb:

class A < Resource
  ClassHash[[TypeValue = 1, ClassValue = ClassValue]] = self

ここの「ClassValue = ClassValue」が問題の箇所。これはネストの外側の定数を自クラスにコピーしている、と読むらしい。

以下のように書き換えた

class A < Resource
  TypeValue = 1
  ClassValue = IN::ClassValue
  ClassHash[[TypeValue, ClassValue]] = self # :nodoc:

こちらもより明確になったのではないだろうか。大差ないけど。

ついでに、load()のwrap modeにおいて正しい順序で定数探索するようにした。 1.8ではwrapを行うanonymous moduleの優先順位が高すぎる。 1.9でもメソッドの探索順位は直ってないわけだが...。

これは将来Classboxを導入した時にwrap modeをClassboxで実装すれば根本的に解決するように思う。Classboxっていろいろ使えるな、魔法のようだ。効率良く実装できれば世界が変わるかも。


«前の日記(2006年02月16日) 最新 次の日記(2006年02月18日)» 編集