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?

QUIT

ループ構造またはルーチンの実行を終了します。

Synopsis

QUIT:pc expression
Q:pc expression

QUIT n
Q n

引数

pc オプション — 後置条件式
expression オプション — 呼び出すルーチンに返す値。有効な式。
n オプションプログラマ・モード・プロンプトのみ :クリアするプログラム・レベルの数。正の整数に解決される式。

説明

QUIT コマンドは、以下の 2 つのコンテキストで使用されます。

プログラム・コード内

QUIT コマンドは、現在のコンテキストの実行を終了し、囲んでいるコンテキストに移動します。QUIT は、ルーチン内で呼び出されると呼び出し元のルーチンに戻り、呼び出し元のルーチンがない場合は、プログラムを終了します。FORDO WHILE、または WHILE の各フロー制御構造、TRY または CATCH ブロック、または従来の DO 構造内から発行されると、QUIT は構造を終了し、その構造の外側にある次のコマンドで実行を続けます。

類似する RETURN コマンドは、FORDO WHILE、または WHILE ループまたは入れ子のループ構造、TRY または CATCH ブロック、または従来の DO 構造内部を含むどの場所でも、ルーチンの実行を終了します。RETURN は常に現在のルーチンを終了し、呼び出し元のルーチンに戻るか、呼び出し元のルーチンがない場合はプログラムを終了します。

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

  • 引数なし

  • 引数付き

後置条件は、引数として考慮されません。$QUIT 特殊変数は、引数付きの QUIT コマンドが現在のコンテキストを終了する必要があるかどうかを示します。そのために、M16 “許可されていない引数で QUIT しました” と M17 “引数付きの QUIT が必要です” の 2 つのエラー・コードが用意されています。詳細は、"$ECODE"、および "Caché エラー・リファレンス" の "ISO 11756-1999 標準の M プログラミング言語エラー メッセージ" のリストを参照してください。

引数なしの QUIT

引数なしの QUIT は、値を返さずに現在のコンテキストを終了します。これは、DO コマンドまたは XECUTE コマンドで開始された処理の実行レベルを終了するため、または FORDO WHILE、または WHILE の各フロー制御ループを終了するために使用されます。

DOXECUTE、(入れ子になっていない) フロー制御ループの各コマンドがプログラマ・モードで実行されたものであった場合、QUIT はプログラマ・モードに制御を戻します。終了したプロセスで、QUIT コマンドの前に NEW コマンドが配置されている場合、QUIT は、対象となっていた変数に自動的に KILL を実行し、元の値をリストアします。

引数付きの QUIT

QUIT expression は、ユーザ定義関数またはオブジェクト・メソッドを終了し、指定された式の結果を返します。FORDO WHILEWHILE のいずれかのコマンド・ループの内部からルーチンを終了するために引数付きの QUIT を使用することはできません。引数付きの QUIT を使用して、TRY ブロックまたは CATCH ブロック内部から終了することはできません。

引数付きの QUIT がサブルーチン内で呼び出されると、以下のいずれかが発生します。

  • (関数の代わりに) サブルーチンの内部から引数付きの QUIT が呼び出された場合、QUIT 引数は評価され (副次的作用またはエラーが発生する場合あり)、引数の結果が破棄されます。実行はサブルーチンの呼び出し元に戻ります。

  • サブルーチンが DO によって呼び出され、その DO 引数の範囲にある場合は、 QUIT はその引数 (およびその評価によって引き起こされるすべての副次的作用) を評価しますが、引数は返しません。例えば、QUIT 4/0 で終わる DO に呼び出されたサブルーチンは <DIVIDE> エラーを生成します。同じ動作は、サブルーチンが引数付の QUIT で終了する DO に呼び出され、かつそのサブルーチンは $ETRAP で終了する場合でも発生します。

プログラマ・モード・プロンプト

プログラマ・モード・プロンプトで QUIT を発行すると、プログラム・スタックからエンティティがクリアされます。

  • QUIT n は、指定された番号のレベルをプログラム・スタックからクリアします。

  • QUIT は、プログラム・スタックからすべてのレベルを消去します。

$STACK 特殊変数は、コール・スタックのコンテキスト・フレームの現在の番号を含みます。この番号は、プログラマ・モード・プロンプトでも表示されます。

以下の例では、整数の引数付きの QUIT を使用して、プログラム・スタックから指定された番号のレベルをクリアし、次に引数なしの QUIT を使用して残りのレベルすべてを削除します。

USER 5f0>QUIT 1
 
USER 4d0>QUIT 2
 
USER 2d0>QUIT

USER>

詳細は、"Caché ObjectScript の使用法" の “エラー処理” の章にある "プログラマ・モードのエラー処理" を参照してください。

引数

pc

オプションの後置条件式です。Caché は、後置条件式が True (0 以外の数値) の場合にこのコマンドを実行します。Caché は、後置条件式が False (0) の場合はコマンドを実行しません。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。QUIT コマンドが引数を取らない場合、同じ行における後置条件と次のコマンドの間に 2 つ、またはそれ以上のスペースが必要です。

expression

任意の有効な ObjectScript 式。これはユーザ定義の関数内でのみ使用され、呼び出し元のルーチンに評価結果を返します。

以下の 2 つの例では、フロー制御構造内から発行されたときの QUITRETURN の動作を比較します。QUIT は、FOR ループを終了し、MySubroutine の残りを続けて実行してから MyRoutine に戻ります。RETURN は MySubroutine を終了して MyRoutine に戻ります。

MyMain
  WRITE "In the main routine",!
  DO MySubroutine
  WRITE "Returned to main routine",!
  QUIT
MySubroutine
  WRITE "In MySubroutine",!
  FOR i=1:1:5 {
    WRITE "FOR loop:",i,!
    IF i=3 QUIT
    WRITE "  loop again",!
  }
  WRITE "MySubroutine line displayed with QUIT",!
  QUIT
MyMain
  WRITE "In the main routine",!
  DO MySubroutine
  WRITE "Returned to main routine",!
  QUIT
MySubroutine
  WRITE "In MySubroutine",!
  FOR i=1:1:5 {
    WRITE "FOR loop:",i,!
    IF i=3 RETURN
    WRITE "  loop again",!
  }
  WRITE "MySubroutine line not displayed with RETURN",!
  QUIT

以下の例では、最初の QUIT コマンドの実行は後置条件 (:x>46) によって制御されます。乱数が 46 より大きい場合は、Caché は Cube プロシージャを実行しません。最初の QUIT が後置条件を受け、文字列を num として呼び出し元のルーチンに返します。乱数が 46 以下の場合は、2 つ目の QUIT が式 x*x*x の結果を num として返します。

Main
  SET x = $RANDOM(99)
  WRITE "Number is: ",x,!
  SET num=$$Cube(x)
  WRITE "Cube is: ",num
  QUIT
Cube(x) QUIT:x>46 "a six-digit number."
  WRITE "Calculating the cube",!
  QUIT x*x*x

以下の 2 つの例では、TRY および CATCH を使用した QUITRETURN の動作を比較します。TRY ブロックは、0 による除算を試行するので、CATCH ブロックが呼び出されます。この CATCH ブロックには、QUIT または RETURN のいずれかで終了する入れ子の TRY ブロックが含まれます (デモンストレーションのために、これらのプログラムには “フォールスルー” を防ぐために推奨されているコード (QUIT または RETURN) は含まれていません)。

QUIT は、入れ子の TRY ブロックを終了して囲んでいるブロックに移動し、CATCH ブロックの残りで実行を続けます。CATCH ブロックを完了すると、TRY/CATCH 構造の外側にあるフォールスルー行を実行します。

  TRY {
    WRITE "In the TRY block",!
    SET x = 5/0
    WRITE "This line should never display"
  }
  CATCH exp1 {
    WRITE "In the CATCH block",!
    WRITE "Error Name: ",$ZCVT(exp1.Name,"O","HTML"),!
      TRY {
        WRITE "In the nested TRY block",!
        QUIT
      }
      CATCH exp2 {
        WRITE "In the nested CATCH block",!
        WRITE "Error Name: ",$ZCVT(exp1.Name,"O","HTML"),!
      }
    WRITE "QUIT displays this outer CATCH block line",!
  }
  WRITE "fall-through at the end of the program"

RETURN はルーチンを終了します。そのため、入れ子の TRY ブロックと囲んでいるブロックをすべて終了し、TRY/CATCH 構造の外側にあるフォールスルー行を実行しません。

  TRY {
    WRITE "In the TRY block",!
    SET x = 5/0
    WRITE "This line should never display"
  }
  CATCH exp1 {
    WRITE "In the CATCH block",!
    WRITE "Error Name: ",$ZCVT(exp1.Name,"O","HTML"),!
      TRY {
        WRITE "In the nested TRY block",!
        RETURN
      }
      CATCH exp2 {
        WRITE "In the nested CATCH block",!
        WRITE "Error Name: ",$ZCVT(exp1.Name,"O","HTML"),!
      }
    WRITE "RETURN does not display this outer CATCH block line",!
  }
  WRITE "fall-through at the end of the program"

以下の例での QUIT コマンドの引数は、オブジェクト・メソッドです。Caché はメソッドの実行を終了して、呼び出しているルーチンに制御を戻します。

   QUIT inv.TotalNum()

メモ

QUIT による変数のリストア

終了したプロセスで、QUIT コマンドの前に NEW コマンドが配置されている場合、QUIT は、対象となっていた変数に自動的に KILL を実行し、元の値をリストアします。

QUIT とフロー制御構造

QUIT は、FOR ループ、DO WHILE ループ、および WHILE ループを終了するために使用されます。ループ構造の最後に続くコマンドで実行を継続します。これらのループ構造が入れ子になっている場合、QUIT を実行すると、その呼び出し元の内側のループが終了して、そのループの外側のループに実行が移ります。

QUIT コマンドが IF コード・ブロック (あるいは ELSEIF コード・ブロックまたは ELSE コード・ブロック) 内にある場合、QUIT は、このコード・ブロックが存在しないかのように、通常の QUIT コマンドとして動作します。

  • IF コード・ブロックが、ループ構造 (FOR コード・ブロックなど) 内で入れ子にされている場合は、QUIT はそのループ構造ブロックを終了し、このループ構造コード・ブロックに続くコマンドで実行を続けます。

  • IF コード・ブロックがループ構造内で入れ子にされていない場合は、QUIT は現在のルーチンを終了します。

QUIT は、従来の DO 構造 (引数のない DO にコードの行が続き、それぞれの行の先頭がピリオド) を終了するために使用できます。引数なしの DO 構造コード・ブロックに続くコマンドで実行を継続します。この引数なしの DO 構文は、廃止されたと見なされているため、新規のコーディングには使用しないでください。詳細は、"引数なしの DO (従来のバージョン)" を参照してください。

無限の FOR ループでの使用

無限の FOR ループは、引数なしの FOR です。終了されない限り、無限にループします。無限の FOR ループを制御するには、後置条件付きの QUITQUIT を呼び出す IF コマンドのどちらかをループ構造に含める必要があります。IF 内の QUIT は、囲まれている FOR ループを終了します。これらの QUIT が 1 つもない場合、ループは無限ループとして、無限に実行され続けます。

以下の例では、無限の FOR ループは、後置条件付きの QUIT を使用して終了します。ユーザが "Text =" プロンプトへの応答として値を入力する限り、このループの実行は継続します。ユーザが NULL 文字列を入力した (つまり Enter を押しただけ) の場合にのみ、QUIT が実行され、ループが終了します。

Main
  FOR   {
    READ !,"Text =",var1 
    QUIT:var1=""  DO Subr1
    }
Subr1
   WRITE "Thanks for the input", !
   QUIT

このコマンドには、QUIT コマンドの後置条件と、それに続く同じ行の DO コマンドの間に、少なくとも 2 つのスペースが必要です。Caché は後置条件を引数ではなく、コマンド修飾子として処理するからです。

暗黙の QUIT

以下の場合、QUIT コマンドは必要ありません。Caché は自動的に暗黙の QUIT を呼び出し、異なるコード・ユニットの実行が "フォールスルー" しないように防ぎます。

  • Caché はルーチンの最後に暗黙の QUIT を実行します。

  • Caché はパラメータを持つラベルに遭遇した場合、暗黙の QUIT を実行します。パラメータを持つラベルは、括弧内にパラメータが何も含まれていない場合でも、括弧付きのラベルとして定義されます。すべてのプロシージャは、(パラメータが定義されていない場合でも) パラメータを持つラベルから始まります。多くのサブルーチンと関数にも、パラメータを持つラベルがあります。

どのような環境でも、明示的な QUIT はコード化できます。

DO での振る舞い

QUIT は、DO コマンドによって呼び出されたサブルーチンの内部で実行された場合、サブルーチンを終了し、DO コマンドの次のコマンドに制御を戻します。

XECUTE での振る舞い

QUIT は、XECUTE が実行されているコード行で実行された場合、その行の実行を終了し、XECUTE コマンドの次のコマンドに制御を戻します。引数は指定できません。

ユーザ定義関数での振る舞い

QUIT は、ユーザ定義の関数で使用された場合、その関数を終了し、指定された式の結果の値を返します。expression 引数は必須です。

その用途は、ユーザ定義関数はパラメータ渡しの DO コマンドとほぼ同じです。DO コマンドとの違いは、式の値を、変数を介してではなく、直接返すことです。外部関数を呼び出すには、以下の形式を使用します。

$$name(parameters)

name には関数の名前を指定します。 label^routine、または label^routine の形式で指定できます。

parameters には、関数に渡される、コンマ区切りのパラメータ・リストを指定します。関数に関連付けられた label もパラメータ・リストを持っている必要があります。呼び出される関数のパラメータ・リストは、実パラメータ・リストと呼ばれます。関数ラベルのパラメータ・リストは、仮パラメータ・リストと呼ばれます。

以下の例では、FOR ループは最初に READ コマンドを使用して、2 乗する数字を取得、それを変数 num に保存します。(引数なしの FOR と後置条件付きの QUIT の後にスペースが 2 つ含まれていることに注意してください)。次に、WRITE コマンドを使用して、関数のパラメータとして num を指定した標準関数 Square を呼び出します。

この関数の唯一のコードは、2 乗を計算する式が続く QUIT コマンドです。QUIT コマンドに遭遇すると、Caché は式を評価し、関数を終了し、結果の値を直接 WRITE コマンドに返します。num の値は変更されません。

Test  WRITE "Calculate the square of a number",!
  FOR   {
    READ !,"Number:",num QUIT:num="" 
    WRITE !,$$Square(num),!
    QUIT
  }
Square(val) 
  QUIT val*val

プログラムを読みやすくするために QUIT を使用する

Caché は各ルーチンの最後に暗黙の QUIT を実行しますが、プログラムを読みやすくするために、明示的に QUIT を含めることもできます。

関連項目

FeedbackOpens in a new tab