ラベル型変数を使って無理やり動的メソッド呼び出しを実現してみる
※ 黒魔術注意。この記事には実用的なスクリプトはありません。
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