«前の日(11-20) 最新 次の日(11-22)» 追記

Matzにっき


2003年11月21日

_ [会社]出社

火曜日に帰国したのだが、寝込んだりしていたので今日が帰国後最初の出社になる。 今回はおみやげはなし。というか、本当に時間がなくて家族にもろくにおみやげを買う暇がなかった。

_ [Ruby]ローカル変数

Rubyの設計で失敗したと思ってる点は実はいくつもあるのだが、 そのうち最大のものはおそらくローカル変数のスコープだ。

現在のRubyのローカル変数のスコープは

  • class/module/defで導入される(対応するendまで)。これらはネストしない。
  • ブロックで導入される。これはネストする。

というものだ。後者が曲者だ。このスコープにより、 ブロックの内部ではじめて登場したローカル変数はブロックの内部でだけ有効で、 ブロックの終了とともに消えるというルールが成立する。

一見するとそんなに変なルールではない。実際に私も最初に思いついた (closureのためのローカル変数が必要で導入した)時には、結構いいアイディアだと思っていた。

ところが問題はRubyの特徴である宣言がないところにある。 つまり、あるローカル変数の有効範囲がどこまでなのかがひとめでわからない。 ブロックが始まる前に初期化されているかどうかは、スコープの先頭までさかのぼって見ないといけない。 あるいはたまたま変数名が重なっちゃったりすると思わぬ挙動を引き起こすことになる。

そんな探さなくちゃいけないほど長いメソッドを書くことや、 偶然重複しちゃうような安易な名前を使うことに問題があるといえばそうなのだが、 「変数のスコープがひとめでわからない」というのはRuby的には面白くない。

で、機会があれば直そうとずっと考えていたのだ。

直す方法はいろいろ考えられたが、長らく考えて結局これがベストと思えるものは以下の通り。

  • class/module/defで導入される(対応するendまで)。これらはネストしない。
  • ブロックパラメータはローカル変数に限る
  • ブロックパラメータの有効範囲はそのブロック限定

要するに宣言なしにネストするスコープを導入しようとするから問題なわけで、 最初に設計した時点では宣言を避けることにこだわり過ぎていたようだ。 今回はブロックパラメータを宣言として利用しようということ。

この際ブロックパラメータと同じ名前のローカル変数がすでにあった場合にはどうするべきかという課題がある。 これには、「名前を気にしたくない、重複を許すべき」派と 「重複は悪である、許すべきでない」派がいる。私(や前田くん)は後者だが、 世の中には前者も多いようだ。今のところ、「許すが警告が出る」という どちらにも嬉しくない両者痛み分けの対応を考えている。

以前のアイディアの中には

  • 「:=」で代入した変数はブロックローカル
  • ブロックパラメータの後ろに「;」で区切ってブロックローカル変数名を羅列

などもあったが、前者は簡潔な記法ではあるが「宣言」としては目立たなすぎるので不採用。 後者もそんなに多用することはないだろうということになった。局所変数が必要であれば

local {|a,b,c|
  ...
}

というようなローカル変数導入用メソッドを用意すればよいだろう。 ブロックパラメータはローカル変数に限るというルールにより、 パラメタ宣言は代入の左辺よりもメソッド定義の仮引数に近いこととなり、 あるいはデフォルト値を使って

let {|a=1,b=2,c=3|
   ...
}

のような書き方を許すようになるかもしれない。

結局採用しなかったアイディアの中でもっとも大がかりなものは、 ブロックローカル変数は、現在のように最初に宣言されたブロックに所属するのではなく、 もっとも外側で参照されたブロックに所属するというものだ。

def foo(a,c)
  a.each{|e|
    e.each_with_index{|ee,i|
      break if ee == c
    }
    puts i    # ここでiが参照されている
              # よってiはこのブロックに所属
  }
end

結構面白いし、今でもうまく運用できそうな気もしている。 しかし、「説明するのが面倒なルールは良くないルール」の原則によりボツになったのだった。

_ [日記]時差

Xellossさんから「最近日記が1週間ずれている気がするのですが」と ツッコミをいただいてます*1。 これは一種の時差ぼけです(本当か?) 。そのうち追いつくと思います。

*1  これを書いてるのは27日です


2004年11月21日

_ [教会]松江

岡山には行かず、松江に。 子供たちは年に一度の発表の日であった。

それぞれにがんばったと思うよ。


2005年11月21日

_ 仕事が進んだ日

論文と書類が一通り終わって、 大学に提出。いくつかどうしても足りないものは 後から用意することに。

また、雑誌原稿のゲラを二本仕上げて、 こまごまとした仕事も終わらせた。

それと伸び伸びになっていたセキュリティレポートをwww.ruby-lang.orgに上げた。 これは対応が遅くて申し訳なかった、と思う。 なかなかレポートが揃わなかったり、確認ができなかったり、と 内輪の事情はあったのだが、言い訳にしかすぎない。

実質的な影響を受けた人はいなかったと思うのがせめてもの救いだ。

いや、いろいろ片付いたので気分が良い。


2006年11月21日

_ [OSS] GPLv3スライド

明日のGPLv3カンファレンスのスライドに着手。

忙しくて手抜きになってしまった。申し訳ない。

ってか、開発者たるもの、ライセンスよりは開発そのものに関して 知識・経験を活用すべきだよね、ねっ。

_ [OSS] 「LinuxユーザーはMicrosoftに借りがある」、バルマー氏が明言

またFUD。特許がらみなのが悪質だ。 それならちゃんと特許番号を示してみろってんだ。

マイクロソフトに対して積極的に敵意を持とうと思ってるわけじゃないんだけど、 要所要所でこういう反発せざるをえない発言をしてくれるのが困る。

_ 「ユビキタスの鍵」−ターボリナックスが携帯型PC「Wizpy」を発表

ちょっと欲しいかも。値段も安そうだし。

_ 「オンリーワンが人の心に火をつける」---松江市長 松浦正敬氏がRuby City Matsueプロジェクトを語る

語ってくれちゃってます。とりあえず聞いてて励まされる内容です。 これがどれだけ成果を生むのか、注目して見てましょう。

って、人ごとな態度ではまずいんだろうな。 がんばって成果を生むようにしよう。そうしよう。


«前の日(11-20) 最新 次の日(11-22)» 追記