けいじゅ@SHLジャパンです. 

ナガーイメイルは後に回します. 今日中に返事ができればいいんだけど... あ
と, pipeの件もあるし...

In [ruby-list :00408 ] the message: "[ruby-list:408] Re: reexecute
from rescue [ Re: about exception ] ", on Aug/13 01:21(JST)
matz / caelum.co.jp (Yukihiro Matsumoto) writes:

>それは無理ですけど,
># closure は call/cc ではないので.
>closureを引数などで渡しておいて例外が起きたら評価するという
>のは出来ると思います.

?? 良く分からん. と思ったら, 次のメイルに書いてありましたね.

In [ruby-list :00409 ] the message: "[ruby-list:409] Re: reexecute
from rescue [ Re: about exception ] ", on Aug/13 01:49(JST)
matz / caelum.co.jp (Yukihiro Matsumoto) writes:

>具体的なコードで書くと以下の通りです.
>
>def each(lambda)
>   begin
>     ...
>     yield ..
>   rescue
>     lambda.call
>     retry
>   end
>end
>
>each(proc{...}) {
>  ...
>}

なるほど, 例外が起こった時の処理を イテレータブロック(?)として渡すわけ
ですね. この方法なら対処できそうです. 

Smalltalk の

coll remove: elm ifAbsent: [...]

と同じ考えですね. ruby でも こういう感じのメソッドがあるかと思って調べ
ましたがありませんでした. やはり, 例外があるからかな?

>|あと, 質問ですが, 例外からぬける方法は以下のもの以外に何かあるのでしょ
>|うか?
>|
>|* break/ブロック最後: そのbegin...end からぬける
>|* retry: begin ... end の begin から
>|
>|# return はやはりできなかった...
>
>はい? 例外から抜けるというのはrescue節から抜けるという意味で
>すか? それとも trap などのイテレータブロックから抜けるという
>意味ですか?

rescue節でした.

>rescue節は特別な制御スコープを導入しませんから,beginから再
>実行するretryを除いてはbeginの外側となにも変わりません.
>returnも使えます.

そうすると, break で rescue 節を抜ける(begin..endを終る)ことはできない
のですね?  

# return が使えなかったのは, mainモジュールだったからでした...

>イテレータブロックはその場で評価されるものは普通のループと変
>わりません.trapのようにclosureとして保存されてあとで評価さ
>れるものは break(脱出),next(やり直し)だけしかつかえません.
>今ソースを見たらreturn, retryも通しているようですが,これは
>バグです.

ふむふむ...

In [ruby-list :00409 ] the message: "[ruby-list:409] Re: reexecute
from rescue [ Re: about exception ] ", on Aug/13 01:49(JST)
matz / caelum.co.jp (Yukihiro Matsumoto) writes:

>さらによくソースを見ると break を通していませんでした.これ
>もバグです.今までの説明と動作が食い違っていましたね.ごめん
>なさい.

trap(closureも含めて)中で, breakは意味が分かりましたが, nextはどういう
動作を行なうのでしょうか?

__
..........................................石塚 圭樹@SHLジャパン(株)...
------------->アドレス変わりました!! e-mail: keiju / shljapan.co.jp <----