exist_goto / exist_gosub / exist_return

引数に指定したラベルが存在したら、そのラベルに飛ぶ何かを作ってみる。

解説

三つの命令を作る。

  • exist_goto
  • exist_gosub
  • exist_return

基本的な機能は同じ。引数にラベルを指定する。(正確には、ラベルと判断される文字列と文字列変数の集合)
そのラベルが存在するならば、そのラベルにgotoする/gosubする/returnする。

命令 ラベルが存在した場合 ラベルが存在しない場合
exist_goto そっちに飛んで返ってこない 何もせず次の行へ
exist_gosub そっちの処理を済ませてから次の行へ 何もせず次の行へ
exist_return そっちにreturnする。スタックに注意 何もせず次の行へ

前二者はそれなりに使い道は考えつくけれど、exist_returnは難しいかなあ。

define節game以上

numalais labelexist,(適当な数値)
defsub exist_goto
defsub exist_gosub
defsub exist_return

game以下*start以上

*exist_goto
getparam $labelexist
labelexist %labelexist,$labelexist
if %labelexist=1 return $labelexist
return

*exist_gosub
getparam $labelexist
labelexist %labelexist,$labelexist
if %labelexist=1 goto $labelexist
return

*exist_return
getparam $labelexist
labelexist %labelexist,$labelexist
if %labelexist=1 return *exist_return_main
return
*exist_return_main
return $labelexist

使い方

これを説明しておかなければならなかった。
オブジェクト指向プログラミングにおけるメソッドのオーバーライドに似た効果が得られる。

*work
getparam $mode
exist_gosub "*"+$mode+"_work"
default_work
return

こういうスクリプトがあったとする。
work命令に与える引数と、それに合わせたサブルーチン作ることによって、work命令に動作を追加したりしなかったりができる。
共通部分の多い一連の処理の中で、ちょっとだけ違う処理を加えるのに便利。