[前][次][番号順一覧][スレッド一覧][生データ]

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]