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.