From: NAGAI Hidetoshi Date: 1998-07-07T13:52:08+09:00 Subject: [ruby-dev:3227] Re: Ruby/Tk unofficial patch 永井@知能.九工大です. >>>>> "M" == Yukihiro Matsumoto writes: M> In message "[ruby-dev:3225] Ruby/Tk unofficial patch" M> on 98/07/07, NAGAI Hidetoshi writes: M> |Ruby/Tk の bug fix および機能追加のための unofficial patch です. M> |ruby-1.1b9_29 からの差分になっています. M> どうもです.取り込みます. ありがとうございます.残る send の実装も急ぎます. M> |この最後の「イベント処理の continue, break 」は, M> |バインドタグ集合におけるバインド処理の流れを制御するものですが, M> |実装には次の方法をとっています. M> | ・continue, break に対応する特別の例外を発生させる. M> こういう目的にはcatch/throwの方が向いていると思います.値も M> 渡せるし. catch/throw はまだ使ったことがない(*^_^*)ので, あまり確信をもって言えることではないのですが, 今回は例外を用いる方がいいかなと思ってました. Ruby/Tk 上でのイベント処理は, イベント発生 ↓ 1: ( Tk 上 ) rb_out プロシージャ呼び出し ↓ 2: ( Tk 上 ) ruby コマンド呼び出し ↓ 3: ( Ruby 上 ) TkCore.callback メソッド呼び出し ↓ 4: ( Ruby 上 ) コールバック実体の実行 となってますよね. break などの場合,1: から return -code break ... などとして 戻らねばならないので,2: から 1: へ戻る際に単なる値を返したのでは 単なる実行結果なのかどうかの判断に困ります. そのため,2: では return -code break などに相当するように return しておかなければなりません. ですから,4: で Tk の break, continue に相当する処理が行われたことは, Ruby <=> Tk のインターフェースである 2: の ruby コマンドの中で 捕捉してやる必要があるのですが,C プログラムである ruby コマンド中で throw を catch するというのは方法がわかりませんでした.(^_^; 上記 3: で捕捉しても意味がないですよね. それにイベント処理中の break, continue ですから,値は不要のはずです. また,イベント処理中でなければ,break, continue を 不正利用したわけですから,エラーになるのが自然です. 例外の方が素直に実現できそうに思えました. うまく説明できないのですが,おわかりいただけますでしょうか? 「そんなことはない」という点は指摘いただけると助かります. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp