VMの仕様パート2 / 分岐コマンド、函数コマンド / 非公式訳

p.158

分岐コマンド

  • label label: 函数のコード内にこのコマンドが記述されると、記述された位置にラベルで名前がつけられる。ラベルで示された位置へしかジャンプできない。ラベルのスコープは、そのラベルが定義された函数の範囲内である。labelは、数字、下線、ドット、コロンから成る文字列であるが、先頭は数字以外とする。labelコマンドは、そのラベルを参照するgotoコマンドの前であろうと後ろであろうと函数内のどこにでも配置できる。
  • goto label: 無条件ジャンプを実行する。ラベルで示された位置へ実行フローが移る。gotoコマンド、およびラベルで示されたジャンプ先は、どちらも同じ函数内になければならない。
  • if-goto label: 条件つきジャンプを実行する。スタックの最後尾値がポップされ、その値がゼロでない場合は、ラベルで示された位置へ実行フローが移るが、それ以外の場合はジャンプせずにそのまま次のコマンドが実行される。if-gotoコマンド、およびラベルで示されたジャンプ先は、どちらも同じ函数内になければならない。

函数コマンド

  • function functionName nVars: functionNameという名前のついた函数の始点を示す。nVarsは、当該函数にローカル変数が何個あるのかを示す。
  • call functionName nArgs: functionNameという名前のついた函数をコールする。nArgsは、コールするまでに何個の引数をスタックにプッシュしたのかを示す。
  • return: 現在の函数をコールした函数のコードにあるcallコマンドの直後のコマンドに実行フローが移る。