In message <19991116042914C.yasuf / big.or.jp> yasuf / big.or.jp writes: > > 「例外」という言葉を、安易に使ってしまいました。C++でも、障害復旧 > > 目的以外に(大域脱出のために)、try/throw/catchをよく使うので、 > > その点では同じだと判断しました。ただ、C++ではthrowしないと > > catchは実行されないのでちょっと気になった次第です。 > > Rubyの catch/throw は、C++の try+catch/throw というよりは、むしろCの > setjmp()/longjmp() に似ています。 「むしろ Lisp の catch/throw に似ています」っていうのはどうだろう :-) # そのままである. > guile # scheme だけど :-P guile> (catch 'foo ... (lambda () 10 20 30) ... (lambda x (write x))) 30 guile> (catch 'foo ... (lambda () 10 (throw 'foo 20) 30) ... (lambda x (write x))) (foo 20) (catch key body unwind-protect) というかたちみたいですね.scheme だか ら,素直に関数を引数にしてしまえている.Lisp だと 2 つめは form で 3 つめは.... あったかな? # unwind-protect というフォームがあったような気がする. > > > x = catch(:hoge){ throw(:hoge) unless num > 0; num } > > > ーん。もし、num>0ならthrowは実行されないので、ブロックの > > 最後の値になるということですね。throwしないのに、こぼれた > > numの値を「catch」するってことになる...(しつこくてすいません) > > catchするのは「引数で指定されたタグ(:hoge)」であって、値ではありません。 > 対応するタグがthrowされなかったら、catchは何もcatchせずに終了します。 ということで,ますます.「catch の値はブロックの値かブロック内でされた 指定した tag とともに throw された値である」というのを,ruby ではブロッ クを受け取るメソッドでうまく書けた,っていうことで. -- 柳川和久 @ 東大阪市 . 大阪府 November 16, 1999 He knows most who speaks least.