コマンド・プロシージャ・レベルを変更せずに, 制御をコマンド・プロシージャ内のラベルが付けられたサブルーチンに渡します。
GOSUB ラベル
ラベルは,現在のコマンド・プロシージャの中で, GOSUBステートメントの前でもあとでもかまいません。 コマンド・プロシージャ内でラベルを使用する場合には, 最後にコロンを指定しなければなりません。 ラベルが重複している場合,最も最近読まれたラベルへ飛びます。
RETURNコマンドは,GOSUBサブルーチン・プロシージャを終了させ, GOSUB文の呼び出しの次のコマンドへ制御を移します。 RETURNコマンドは,省略可能な状態値を受け付けます。
GOSUBコマンドでは,新しいプロシージャ・レベルは生成されません。 したがって,これを "ローカルの" サブルーチン呼び出しと呼びます。 現在のコマンド・プロシージャ・レベルで定義されたラベルとローカル・シンボルは, GOSUBコマンドで呼び出されたサブルーチンで使用できます。 GOSUBコマンドは,プロシージャ・レベル当り,最高16レベルまでネストできます。
コマンド・インタプリタは,ラベルを検出すると, ラベル・テーブルにラベルを入れます。このテーブルは, ローカル・シンボル・テーブルで使用できる領域から割り当てられます。 コマンド・インタプリタがすでにテーブルに存在しているラベルを検出すると, 既存の定義が新しい定義で置き換えられます。したがって,重複ラベルを使用すると, 制御は常にDCLが最後に読み取ったラベルに移ります。次の規則が適用されます。
現在のコマンド・プロシージャにラベルが存在しない場合, プロシージャは続行できないため,強制終了します。
ラベルに使用できる領域のサイズには,制限があることに注意してください。 コマンド・プロシージャが多くのシンボルを使用し,多くのラベルがある場合, コマンド・インタプリタのテーブル領域が不足し, エラー・メッセージが出ることがあります。
$! $! GOSUB.COM $! $ SHOW TIME $ GOSUB TEST1 $ WRITE SYS$OUTPUT "success completion" $ EXIT $! $! TEST1 GOSUB definition $! $ TEST1: $ WRITE SYS$OUTPUT "This is GOSUB level 1." $ GOSUB TEST2 $ RETURN %X1 $! $! TEST2 GOSUB definition $! $ TEST2: $ WRITE SYS$OUTPUT "This is GOSUB level 2." $ GOSUB TEST3 $ RETURN $! $! TEST3 GOSUB definition $! $ TEST3: $ WRITE SYS$OUTPUT "This is GOSUB level 3." $ RETURNこのコマンド・プロシージャは, ラベルを付けられたサブルーチンへ制御を移すための GOSUBコマンドの使い方を示します。 GOSUBコマンドはTEST1にラベルを付けたサブルーチンに制御を移動します。 プロシージャは,サブルーチンTEST1でコマンドを実行し, サブルーチンTEST2へ分岐します。その後,プロシージャは, サブルーチンTEST2でコマンドを実行し,サブルーチンTEST3へ分岐します。 それぞれのサブルーチンはRETURNコマンドによって終了します。 TEST3が実行された後,RETURNコマンドはそれぞれの呼出し GOSUBステートメントに後続するコマンドラインへ制御を返します。 この時点で,プロシージャはうまく実行されています。
制御をコマンド・プロシージャ内のラベルが付けられたステートメントに渡します。
GOTO ラベル
ラベルは,現在のコマンド・プロシージャの中で, GOTOステートメントの前でもあとでもかまいません。 コマンド・プロシージャ内でラベルを使用する場合には, 最後にコロンを指定しなければなりません。 ラベルが重複している場合,最も最近読まれたラベルへ飛びます。
GOTOコマンドのターゲット・ラベルが別のIF-THEN-ELSE構造内にある場合は, エラー・メッセージ(DCL-W-USGOTO)が返されます。
コマンド・インタプリタは,ラベルを検出すると, ラベル・テーブルにラベルを入れます。このテーブルは, ローカル・シンボル・テーブルで使用できる領域から割り当てられます。 コマンド・インタプリタがすでにテーブルに存在しているラベルを検出すると, 既存の定義が新しい定義で置き換えられます。したがって, 重複ラベルを使用すると,制御は常にDCLが最後に読み取ったラベルに移ります。 次の規則が適用されます。
現在のコマンド・プロシージャにラベルが存在しない場合, プロシージャは続行できないので,強制終了します。
ラベルに使用できる領域のサイズには,制限があることに注意してください。 コマンド・プロシージャが多くのシンボルを使用し,多くのラベルがある場合, コマンド・インタプリタのテーブル領域が不足し, エラー・メッセージが出ることがあります。
$ IF P1 .EQS. "HELP" THEN GOTO TELL $ IF P1 .EQS. "" THEN GOTO TELL . . . $ EXIT $ TELL: $ TYPE SYS$INPUT To use this procedure, you must enter a value for P1. . . . $ EXITこの例では,IFコマンドはプロシージャに渡された最初のパラメータを調べます。 このパラメータがHELPという文字列の場合, あるいはパラメータが指定されていない場合には,GOTOコマンドが実行され, 制御はTELLというラベルの行に移ります。 それ以外の場合には,プロシージャはEXITコマンドが検出されるまで実行を継続します。 TELLというラベルでは, TYPEコマンドがプロシージャの使用方法を示す入力ストリームのデータを表示します。
$ ON ERROR THEN GOTO CHECK . . . $ EXIT $ CHECK: ! Error handling routine . . . $ END: $ EXITONコマンドは,エラー処理ルーチンを設定します。 そのあと,コマンド・プロシージャ内で実行されるコマンドあるいはプロシージャが, エラーまたは重大なエラーを報告した場合には,GOTOコマンドは, 制御をCHECKというラベルに移します。