ZGOTOのコマンドは、GT.Mの呼び出しスタック内のさまざまなレベルへ、制御を移します。また、ルーチンのある部分から別へ、または、1つのルーチンから別の指定されたentryref を使って別へ、制御を移すします。
ZGOTOコマンドのフォーマットは:
ZG[OTO][:tvexpr] [[intexpr][:entryref[:tvexpr]],...]
オプションでコマンド直後に続く真理値の式は、GT.Mがコマンドを実行するかどうかをコントロールする後置コマンドです。
オプションの整数式は、ZGOTOを実行することによって到達するスタックフレームのネストレベルを指定します。オプションの整数式が負のレベルを指定すると、ZGOTOはそれを $zlevel-intexpr として扱います。
引数なしのZGOTOは、スタック(レベル1)の下部で次のコマンドへ制御を戻します; この場合は、行の中で次のコマンドと区別するために、コマンドに続き少なくとも2つのスペースが必要です。
オプションの entryref はZGOTOが制御を移行するための位置を指定します。
もしZGOTOが entryref を指定しない場合、整数式で指定されたレベルで次のコマンドへ制御を戻します。
entryref の直後のオプションの真理値式は、後置条件の引数とGT.Mが引数を使用するかどうかの制御を指定します。
もしZGOTOがレベルと後置条件式の引数を含んでいるが entryref が含まれていない場合、2つのコロン ( :: ) は、真理値式と整数式とを区別します。
間接指定演算子と1つ以上のZGOTOの引数リストに評価される原子式(expression atom)は、ZGOTOのための正当な引数を構成します。
ZGOTO は トリガーの entryref(末尾のハッシュ記号(#)付き)を受け取ります; トリガが現在ロードされていない場合(以前のトリガアクションによって)、GT.MはZLINKFILEエラーを生成します。ZGOTOは非常に構造化されていない操作であるため、エラー処理とテストのために予約する必要があることに注意してください。
entryref を持つ ZGOTO コマンドは、GT.Mスタックレベルを減少させるの追加の能力で、GOTOコマンドに似た機能を実行します。単一の操作では、ZGOTO は、暗黙のQUITを実行し、そして、名づけられた entryref に制御を移すGOTO操作を実行 します($ZLEVEL - intexpr) 。入口参照(entryref)の詳細については、 第5章: “Mの一般的な言語特徴” を参照してください。
ZGOTOコマンドは、整数式で指定されたレベルでの呼び出しスタックを残します。GT.Mは、すべてに介入しているFORループを暗黙的に終了し、そして、必要に応じて、NEWコマンドでスタックされた変数をアンスタックします。
ZGOTO 0 を使うと、現在のGT.Mの呼び出しから抜け出る結果を生じさせます。
ZGOTO 0:entryref を使用すると、 "unlink all" 機能が呼び出されます。プロセスは、リンクされているすべてのルーチンとそれ自身との関連付けを解除し、メモリを解放し、M仮想スタック内の唯一の現在のエントリとしてentryrefで実行を続行することができます。ZGOTO 0:entryref は、この遷移の間にローカル変数とIOデバイスを保持し、以下を実行します:
Mプロファイリングを停止します(アクティブな場合)。
Mスタック内のすべてのルーチンを巻き戻します。
すべてのルーチンのリンクを解除し、割り当てられたメモリを解放し、GT.Mが生成したオブジェクトコードを含む共有ライブラリを閉じます。
すべてのキャッシュされたオブジェクト(XECUTEおよび間接参照用に生成されたコード)を一掃します。
$ECODE、$REFERENCE、$TEST を初期(空の)値にリセットします。
ZGOTOは、現在の呼び出しの中でアクティブなレベル数には関係なく抜け出すことを引き起こす点で、HALT(QUITでない)に似ています。 ZGOTOは、GT.Mコンテキストを破棄する点で(HALTでない)QUITに似ています、そして、もし現在のGT.Mの呼び出しがプロセスのベースにある場合にのみプロセスを終了します。ZGOTOとHALTの違いを理解することは、GT.Mが他の言語から再帰的に呼び出される環境だけに影響を与えます。
ZGOTO $ZLEVEL:LABEL^ROUTINE は、GOTO LABEL^ROUTINE と同一の結果を生成します。ZGOTO $ZLEVEL-1 は、QUITと同じ応答を返します(もしダイレクトモードでならば、ZCONTINUE続いて)。もし整数式が、$ZLEVELの現在の値より大きい、または、0(0)未満の値で評価された場合、GT.Mはランタイムエラーを発行します。
もしZGOTOが entryref を持ってない場合、暗黙的QUITのいくつかの番号を実行し、そして、指定されたレベルで次のコマンドへ制御を移行します。もしZGOTOが引数を持たない場合、ZSHOW "S" で表示される最も低いレベルのGT.Mルーチンの動作を再開する ZGOTO 1 のように動作します。$gtm_dist mumps -directにより呼び出されるイメージの中では、引数なしZGOTOは、ダイレクトモードへのプロセスを返します。
ZGOTOは、ダイレクトモードでの便利なデバッグツールが用意されています。しかしながら、 ZGOTOは構造化コーディングを助長しないため、エラー処理のためにプロダクション(本番)プログラムの中で使用を制限することが最善です。 GT.Mのエラー処理の詳細については、 第13章: “エラー処理”を参照してください。