yarv-dev:156
From: SASADA Koichi <ko1 atdot.net>
Date: Sun, 29 Aug 2004 07:53:29 +0900
Subject: [yarv-dev:156] $! problem
ささだです.
$! の実装が大変そうです.
$! って必須ですか?
$! は「今現在どんな例外について処理しています」ということを
示す変数ですよね.
begin
raise E1
rescue E1
p $! #=> E1
end
これは簡単です.
begin
raise E1
rescue E1
p $! #=> E1
begin
raise E2
rescue E2
p $! #=> E2
end
p $! #=> E1
end
これも,スタックを使えばうまくいきそうです.
begin
begin
raise E1
rescue E1
p $! #=> E1
raise E2
end
resuce E2
p $! => E2
end
p $! #=> nil
これが難しいです.フレーム撒き戻しなどの際,その $!用スタック
の先頭を監視し,追い越すときにきちんと取ってやらないとなりません.
これらの処理は,
class E1 < Exception; end
class E2 < Exception; end
1.times{
begin
raise E1
rescue E1
begin
raise E2
ensure
break
end
end
}
(これが E2 エラーにならないのも変かも)
のような場合,breakのようなジャンプ(return なども含む)の
ための撒き戻し作業のときにも,このスタックのチェックを行わな
ければなりません.
つまり,$! をサポートすると,それなりのコストがかかることに
なります.
$! がなくても,明示的に例外オブジェクトは取得できるわけです
から,必要ないんじゃないかなー,と思う今日この頃です.
あ,でも ensure で例外オブジェクトを知ることはできないのか.
(そんなことをする必要があるかはわかりませんが)
私が $! 自体を使わないからそう思うのかもしれませんが.
$! がなければ,これらの苦労はなくなるんじゃないかと思います.
・・・多分.
あと,$! がなくなると raise $! の短縮形の raise ができなく
なっちゃいますね.
--
// SASADA Koichi at atdot dot net
//
--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml
-> 156 2004-08-29 07:53 [ko1 atdot.net ] $! problem 158 2004-08-29 15:22 ┣[matz ruby-lang.org ] 161 2004-08-29 18:09 ┃┗[ko1 atdot.net ] 159 2004-08-29 17:21 ┗[maeda-yarv atusi.org]