ラベル型変数を使って無理やり動的メソッド呼び出しを実現してみる

※ 黒魔術注意。この記事には実用的なスクリプトはありません。
dog_cry_impl, doc_cry と二段構成になっていて、 animal_cry を #modfunc でなく #deffunc なのは、メンバの参照時に違うモジュール内の #modfunc からジャンプしているかチェックしてそのときエラーになるから。(code_get の TYPE_STRUCT でちゃんとチェックしてない - fujidigの雑記を参照)

#module mod_animal vtbl
#modfunc get_vtbl var r, int n
	r = vtbl.n
	return
#deffunc animal_cry var this, local lab
	get_vtbl this, lab, 0
	goto lab
#global

#module mod_dog vtbl, m_name
#modinit str name
	vtbl = *dog_cry_label
	m_name = name
	return
#modfunc dog_cry_impl
	mes m_name + "「わんわん!」"
	return
#deffunc dog_cry var this
*dog_cry_label
	dog_cry_impl this
	return
#global

#module mod_cat vtbl, m_name
#modinit str name
	vtbl = *cat_cry_label
	m_name = name
	return
#modfunc cat_cry_impl
	mes m_name + "「にゃ〜」"
	return
#deffunc cat_cry var this
*cat_cry_label
	cat_cry_impl this
	return
#global

newmod pochi, mod_dog, "ポチ"
newmod tama, mod_cat, "タマ"

animal_cry pochi
animal_cry tama