イアンさんのソースコードを読んでいて、面白い表現があったのでご紹介します。Squeak でも動きます。
jumpTest "self new jumpTest" | cont | cont := [^ self]. self jump: cont jump: cont Transcript cr; show: 'Hop'. Transcript cr; show: 'Step'. cont value. Transcript cr; show: 'Jump!'.
適当なクラスに上のようなメソッドを定義して jumpTest を呼ぶと、Hop, Step までで Jump! が実行されないのです。不思議ですねー。普通はこういう場合例外を使うと思うけど、イアンの奴みたいな例外の無い Smalltalk がもしもあれば使える技です。ちなみにイアンに前、大域ジャンプがやりたいと聞いたとき、この事を教えてくれなくて、C の longjmp を裏で呼べ!と嘘を教えて貰えました。で、今日もっとスマートな解を、彼の古いコードから見つけたのです。イアンの馬鹿!