言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

Squeak で大域ジャンプ

イアンさんのソースコードを読んでいて、面白い表現があったのでご紹介します。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 を裏で呼べ!と嘘を教えて貰えました。で、今日もっとスマートな解を、彼の古いコードから見つけたのです。イアンの馬鹿!