Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

GOTO

制御を移動します。

Synopsis

GOTO:pc
GOTO:pc goargument,...

G:pc
G:pc goargument,...

goargument には、以下を指定できます。

location:pc

引数

pc オプション — 後置条件式
location オプション — 制御の移動先

説明

GOTO コマンドには、以下の 2 つの形式があります。

引数なしの GOTO

引数なしの GOTO は、Caché が現在実行中のコードでエラーまたは BREAK コマンドに遭遇した後に、通常のプログラムの実行を再開します。引数なしの GOTO は、プログラマ・モード・プロンプトからのみ使用できます。

以下の例は、引数なしの GOTO の使用法を示しています。この例では、2 つ目の WRITE は、<BREAK> エラーが原因で実行されません。GOTO を発行すると実行が再開され、2 つ目の WRITE が実行されます。

USER>WRITE "before" BREAK  WRITE "after"
before
WRITE "before" BREAK  WRITE "after"
               ^
<BREAK>
USER 1S0>GOTO
after
USER>

BREAK コマンドの後には、2 つのスペースを配置する必要があることに注意してください。

引数を持たない GOTO の発行時に NEW コマンドが有効な場合、Caché は <COMMAND> エラーを発行し、新しいコンテキストが維持されます。NEW の後に再開するには、QUIT 1 コマンドを実行してから、引数を持たない GOTO を実行してください。

プログラマ・モード・プロンプトで引数なしの GOTO を使用してもエラー後に実行を継続できます。"Caché ObjectScript の使用法" の “エラー処理” の章にある "プログラマ・モードのエラー処理" を参照してください。

引数付きの GOTO

引数 location 付きの GOTO は、指定した場所に制御を移動します。後置条件式をコマンドまたは引数のいずれかで指定した場合、Caché は、後置条件式が True (ゼロ以外) の場合だけ、制御を移動します。

プログラマ・モード・プロンプトから GOTO location を使用して、異なる場所で中断されているプログラムを再開できます。

GOTO コマンドの引数として $CASE 関数を指定できます。

引数

pc

コマンドを条件付きにする、オプションの後置条件式です。後置条件式が GOTO コマンド・キーワードに追加されている場合、Caché は後置条件式が True (0 以外の数値に評価される) の場合に GOTO コマンドを実行します。Caché は後置条件式が False (0 に評価される) の場合は、GOTO コマンドを実行しません。後置条件式が引数に追加されている場合、Caché は後置条件式が True (0 以外の数値に評価される) の場合に引数を実行します。False (0 に評価される) の場合、Caché はその引数をスキップし、次の引数、または次のコマンドの評価に進みます。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。

location

制御の移動先。ルーチン・コード内で GOTO を使用する場合は必須です。プログラマ・モード・プロンプトから実行する場合はオプションです。location は、単一の値、またはコンマで区切られた値のリストとして (後置条件付きで) 指定できます。以下のいずれかの形式を使用できます。

label+offset は、現在のルーチンにある行ラベルを指定します。+offset は負でない整数です。オプションのオフセットでは、ラベルの何行からサブルーチンの実行を開始するかを指定します。offset は、ラベル行を含むコード行、およびコメント行をカウントします。offset は、空白行やコメント内の空白行はカウントしません。ただし、offset は、埋め込み SQL の行をすべてカウントします。この場合は、すべての空白行も含まれます。

label+offset^routine は、ディスクに保存されている指定したルーチン内の行ラベルを指定します。Caché は、ディスクからそのルーチンをロードし、指定されたラベルから実行を続けます。+offset は負でない整数です。オプションのオフセットでは、ラベルの何行からサブルーチンの実行を開始するかを指定します。

^routine は、ディスクに保存されているルーチンを指定します。Caché は、ディスクからそのルーチンをロードし、そのルーチンの先頭から実行を続けます。ルーチンが変更されている場合、GOTO がそのルーチンを呼び出すときに、Caché は更新バージョンのルーチンをロードします。DO コマンドとは異なり、GOTO はルーチンの実行後に呼び出し元のプログラムへは返りません。存在しないルーチンを指定した場合、Caché は <NOROUTINE> エラー・メッセージを返します。詳細は、"$ZERROR" 特殊変数を参照してください。

Note:

GOTO は、拡張ルーチン参照をサポートしません。別のネームスペースでルーチンを実行するには、DO コマンドを使用してください。

上記のいずれかの形式を含む変数として、location を参照することもできます。ただし、この場合は名前による間接指定を使用する必要があります。location には、仮パラメータ・リスト、または外部関数やプロシージャの名前でユーザ定義されているサブルーチン・ラベルを指定することはできません。存在しない label を指定した場合、Caché は <NOLINE> エラー・メッセージを返します。詳細は、"Caché ObjectScript の使用法" の "間接演算" を参照してください。

CACHESYS % ルーチンの呼び出し時における offset の指定はできません。指定しようとすると、Caché は <NOLINE> エラーを発行します。

以下の例では、ユーザが入力した age の値に従って、GOTO コマンドが 3 つの場所のいずれかに実行を移動させます。場所は、変数 loc に格納され、名前による間接指定 (@loc) で参照されるサブルーチン・ラベルです。

mainloop
  SET age=""
  READ !,"What is your age? ",age QUIT:age=""
  IF age<30 {
    SET loc="Young" }
  ELSEIF (age>29)&(age<60) {
    SET loc="Midage" }
  ELSEIF age>59 {
    SET loc="Elder" }
  ELSE {
    WRITE "data input error"
    QUIT }
  GOTO @loc
  QUIT
Young
  WRITE !,"You're still young"
  QUIT
Midage
  WRITE !,"You're in your prime"
  QUIT
Elder
  WRITE !,"You have a lifetime of wisdom to impart"
  QUIT

このタイプの名前による間接指定を使用した GOTO は、プロシージャ・ブロック内では許可されていません。

上記の例の代わりに、IF コマンドを省略し、以下のように、引数に後置条件を使用して、コンマで区切られたリストを持つ GOTO のコードを記述することもできます。

   GOTO Young:age<30,Midage:(age>29)&(age<60),Elder:age>59

同じ例を、適切なサブルーチンの場所を呼び出す DO コマンドを使用してコードを記述することもできます。ただしこの場合は、Caché が QUIT に出会ったとき、DO の後のコマンドに制御が返されます。

以下の例は、offset がコード行をカウントする様子を示しています。これは、間に挟まれたラベル行とコメント行をカウントしますが、空白行はカウントしません。

Main
  GOTO Branch+7
  QUIT
Branch
  WRITE "Line 1",!
SubBranch
  WRITE "Line 3",!
  /* comment line */
  WRITE "Line 5",!

  WRITE "Line 6",!
  WRITE "Line 7",!
  WRITE "Line 8",!
  QUIT

メモ

QUIT に遭遇したときの制御の移動

DO コマンドとは異なり、GOTO は制御を無条件で移動させます。Caché が DO によって呼び出されたサブルーチンで QUIT に遭遇すると、Caché は最後に実行した DO に続くコマンドに制御を渡します。

Caché が GOTO による移動の後に QUIT に遭遇しても、GOTO に続くコマンドには制御は返されません。それ以前に DO があった場合は、最後の DO に続くコマンドに制御が返されます。前に DO がなかった場合は、プログラマ・プロンプトに戻ります。

以下のコード・シーケンスでは、C 内の QUIT が、A 内の DO コマンドに続く WRITE コマンドに制御を返します。

testgoto
A
  WRITE !,"running A"
  DO B
  WRITE !,"back to A, all done"
  QUIT
B  
  WRITE !,"running B"
  GOTO C
  WRITE !,"this line in B should never execute"
  QUIT
C  
  WRITE !,"running C"
  QUIT

コード・ブロックで GOTO を使用する

GOTO はコード・ブロックの終了に使用されますが、コード・ブロックの開始には使用できません。

FORIFDO WHILE、または WHILE ループ内で GOTO を使用する場合、すべてのコード・ブロックの外の location、あるいは現在のコード・ブロック内の location に移動するか、もしくは入れ子にされたコード・ブロックからそれを囲むコード・ブロック内の location に移動できます。独立したコード・ブロック、あるいは現在のコード・ブロック内に入れ子になったコード・ブロックのどちらの場合でも、コード・ブロックから他のコード・ブロック内の location への移動はできません。例として、それぞれのコマンドを参照してください。

コード・ブロックの外部にある location に対する GOTO は、ループを終了します。コード・ブロックの内部にある location に対する GOTO は、ループを終了しません。入れ子にされたコード・ブロックから、それを囲むコード・ブロックへの GOTO は、内部 (入れ子にされた) ループを終了しますが、外部のループは終了しません。

GOTOTRY または CATCH コード・ブロックの終了に使用されますが、これらのいずれかのコード・ブロックの開始には使用できません。また、GOTO は、TRY または CATCH キーワードと同じ行のラベルに指定できません。指定しようとすると、<NOLINE> エラーが返されます。

GOTO の制限

以下の GOTO 操作は許可されません。

  • GOTO は、プロシージャに入る、またはプロシージャを終了するために使用できません。

  • GOTO は、入れ子になった引数なしの DO コード・ブロック内で、レベル間をジャンプするために使用できません。

  • プロシージャ・ブロック内では、名前による間接指定での GOTO (GOTO @name) を使用することはできません。

関連項目

FeedbackOpens in a new tab