● ステートメントリファレンス

gosub 、return

サブルーチンの呼び出し、サブルーチンからの復帰を行います。


gosub

サブルーチンへジャンプします。

    gosub $ラベル名

ラベル名先頭の $ は省略する事ができます。
gosub は、指定されたラベルをプログラムの先頭から検索します。ラベルを発見したら、gosub の次の位置をスタックに保存し、その後、発見した位置にジャンプします。


return

呼び出し元に処理を戻します。

    return

    return  条件式

return には起動条件を記述する事ができます。条件が真の場合は return を実行し、偽の場合は次の命令に処理を移します。return を単独で記述した場合は、条件は常に真になります。

return が実行されると、スタックに保存されている戻り先位置(gosub が保存した位置)に処理を移し、スタックを一つ分戻します。

gosub が実行された回数以上に return を実行するとエラーになります。逆に、戻り先情報を消化せずにプログラムを終了した場合(サブルーチン内からプログラムを終了した場合)の挙動は、アプリケーションが決定します。


サブルーチンのネスト

前述の通り、gosub 、return には戻り先情報の連係がありますが、これにはスタックを使用しているので、サブルーチン内から更にサブルーチンを呼び出す事ができます。

$sub1 〜 $sub5 の入れ子(ネスト).

    gosub $sub1
    end

$sub1
    gosub $sub2
    return

$sub2
    gosub $sub3
    return

$sub3
    gosub $sub4
    return

$sub4
    gosub $sub5
    return

$sub5
    return

サブルーチンのネストには限界がありますが、これはアプリケーションが決定します。

if 〜 thenfor 〜 next のネスト数限界は、記述上のネスト数で判断されます。これは、プログラムを実行しても構造が変わらないためです。
サブルーチンの場合は、gosub の記述数分しか呼び出されないとは限らないので、論理的なネスト数で判断されます。
例.

    cnt = 15
    gosub $recurse
    end

$recurse
    return cnt <= 0

    cnt = cnt - 1 : gosub $recurse
    return

上記の場合、記述されている gosub の個数は二つですが、実際には 16階層のネストになります。