«前の日記(2005年12月19日) 最新 次の日記(2005年12月21日)» 編集

Matzにっき


2005年12月20日 [長年日記]

_ [Ruby] Ruby2について考える

先日、「もし、まつもとさんがバスにはねられたらRubyはどうなる」と質問された。

答えは「1.8はそのままバグフィックスしながら継続。現在のRubyは十分に良いから。1.9は自然消滅するかも」である。

ま、自分でも「十分に良い」と思っているRubyだが、改善の余地がないわけではない。

で、改善したい点はいくつもあるのだが、一番気になるのがスコープ問題。 具体的には

  • 変数をブロックの外で使いたいために、宣言としての無駄な代入が必要になる
  • 後置ifなどモディファイヤーの中で代入された変数が、前に登場する本体部で使えない
  • 変数がどこまで使えるのかわかりにくい

そこで、以下のようなルールにしてはどうだろうかと考えている

  • ローカル変数の有効範囲は代入が行われたスコープ(メソッド本体、クラス定義本体など)全体。現状は代入が行われた地点から、スコープの末尾まで
  • だから初出の代入がブロック内でも、前方宣言は不要
  • ただし、ブロック内しか登場しない変数の扱いは、現状のままブロックローカル
  • 「eval "foo"」のスコープ的な意味は「lambda{foo}.call」と同等。よってevalによって導入される新しい変数はevalの外に影響を与えない。
  • ブロックローカル変数宣言が行われた場合は、明示的な宣言があるので有効範囲はブロック内のみ
  • ブロックパラメータにローカル変数が登場した場合、その変数の扱いについてはまだ決めていない。ブロックローカルにするのも面白いし、他の変数と同様の扱いにするのも便利な局面はあるだろう。完全にローカルスコープにしたければ、無名関数式を使えばよいのだし。

他にも「多重代入の明確化」、「メソッドコンビネーション」、「セレクターネームスペース」などなどあるのだが、なかなか決めきれない。

_ [Ruby] The departure of the hyper-enthusiasts

『Thinking in Java』などの著者であるBruce Eckelによる「Javaに飛びついてた連中が今度はRailsのおかげでRubyに移行しているようだ。でも、Pythonに比べてRubyのどこがいいの?」という問いかけ。マジに質問したいのか、「Pythonのがいいじゃん」の婉曲な表現なのか区別はつかない。ただ、彼は前にもRubyに対して同じ問いかけをしているわけで、つまり要するに「Rubyは彼の趣味にはあわないぞ」ということだけなのかな。

で、私はPythonエキスパートではないので、彼の問いかけの対象ではないのだが、 私がPythonで嫌いな点は、実はインデントによるブロック構造ではなく(間接的に関係はしているのだが)、式と文が明確に区別されている点だ。

これのせいで、

  • evalとexecを使い分けなくちゃいけない
  • lambdaで一つの式しかかけない、ので本来不要な局所関数を導入しなくちゃいけない
  • ifなどを式にできない、ので本来不要な一時変数を導入しなくちゃいけない

などなどの弊害がある。いや、これでなにかができなくなるわけじゃないし、 別にたいして困りはしないんだけど、なんかすっきりしないというか、 不要な思考を強制されるというか。

とかいうことを、ruby-talkに書こうとしたら、マシンがハングした。 呪われている。


«前の日記(2005年12月19日) 最新 次の日記(2005年12月21日)» 編集