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

Matzにっき


2006年12月15日 [長年日記]

_ [Ruby] ruby の catch, throw は安心して利用できるのか?

答えは「そのレベルで安心できない人はRubyを使わない方がよい」です。 だって、整数のプラスだってなんだって再定義可能なんだから。

とはいえ、滅多にないとは言え名称の重複を心配しないといけないというのも切ない。

こういう時はまず原典を参照するに限る。 改めてCLtLを参照してCommon Lispのcatchとthrowについて調べてみると、

The catch special form serves as a target for transfer of control by throw. The form tag is evaluated first to produce an object that names the catch; it may be any Lisp object.

とある。がーん、今までずっとシンボルしかダメだと思ってたよ。 任意のオブジェクトがcatch/throwできるのね。

だとすると、やり方はある。

catchに引数を省略した時にタグになるようなオブジェクトを作ってやればいいんだ。 今まではシンボルに限定していたので、今まで使われたことのないシンボルを生成する gensymのようなことをするには抵抗があったのだが(シンボルはGCされないから)、 オブジェクトでいいというのなら、とりあえず任意のオブジェクトを作って渡してやればいいのだ。

新しいAPIだとこういう使い方になる。

catch {|tag|
   ....
   throw tag
}

で、tagは一度きりしか使われないオブジェクトだから(現在の実装は、Objectのインスタンスを渡す)、重複を気にせず使えるようになる。大域脱出させたい時には、tagのオブジェクトを引数で渡してやることになるだろう。

これで安心。

近い将来1.9にコミットしようと考えている。 でも、ささだくんに聞いたら、これってYARVだと実装が難しいんだって。 なかなか難しい問題だ。

_ ソフトウェア ジャパン2007

申し込みサイトがオープンした。 私も発表することになっている。

っていうか、坂村センセの直後に話すのは、ひっじょうに抵抗があるんですけど。 分不相応っていうか、なんていうか。


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