From: Hidetoshi NAGAI Date: 2005-08-10T10:35:34+09:00 Subject: [ruby-dev:26781] Re: some questions about tcltklib.c 永井@知能.九工大です. From: H.Yamamoto Subject: [ruby-dev:26769] Re: some questions about tcltklib.c Date: Tue, 9 Aug 2005 16:38:00 +0900 Message-ID: <20050809163759.7CAC2900.ocean@m2.ccsnet.ne.jp> > treectrl のデモが動くようになりました。rb_jump_tag の件ですが、 (snip) > の error: の部分に来るようなサンプルを作って確かめようと思ったのですが、 (snip) > のいずれも TAG_RAISE として返ってくるようで、うまくいきませんでした。 > error: の部分に来るようなサンプルを提示していただけると助かります。 TAG_RETURN, TAG_BREAK, TAG_NEXT のすべての例は示せません. 実は私もすべてのケースは発生できてはいません. ただし TAG_NEXT だけは,例えば次の例で error: の部分を通り, その位置で Tcl の continue を実行したのと同様に働きます. TkCore::INTERP._eval('foreach i {1 2 3} {puts $i; ruby {puts :fuga; next; puts :hoge}; puts $i}') これの next を break に変更した場合は,期待した通り(?)に その位置で Tcl の break を実行したかのように動くのですが, ここの error: の部分は通りません. また,next を return にした場合は別の例外発生です. なお, module A def A.hoge puts :hoge; next; puts :fuga end end などとして TkCore::INTERP._eval('foreach i {1 2 3} {puts $i; ruby_cmd A hoge; puts $i}') とした場合も,error: の部分は通りませんが その位置で Tcl の continue を実行したのと同様に働きます. 真面目に調べればこの部分すべてがうまく働くようにする方法や例も あるのかもしれません. また,考えてみるに pending_exception_check1 に if (ptr->return_value == TCL_RETURN) { rb_jump_tag(TAG_RETURN); } else if (ptr->return_value == TCL_BREAK) { rb_jump_tag(TAG_BREAK); } else if (ptr->return_value == TCL_CONTINUE) { rb_jump_tag(TAG_NEXT); } を追加しておくというのも「あり」という気がします. # ...というか,これは加えておく方が安全策かも. ですが要求されるケースは,例のようにかなり特殊であり, 他の部分との絡みもあって TAG_RETURN を除いては それなりに期待されたようには働いているので, まぁ,あまり追求する必要もないかなと思ってます. # ...弱気 -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp