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?

RETURN

ルーチンの実行を終了します。

Synopsis

RETURN:pc expression
RET:pc expression

引数

pc オプション — 後置条件式
expression オプション — ObjectScript 式

説明

RETURN コマンドは、ルーチンの実行を終了するために使用されます。多くのコンテキストでは、QUIT コマンドと同義です。RETURNQUIT は、FORDO WHILE、または WHILE フロー制御構造、あるいは TRY または CATCH ブロックの内部から発行されたときに、異なる動作をします。

  • RETURN を使用すると、FORDO WHILEWHILE の各ループまたは入れ子のループ構造内を含む任意の場所からルーチンの実行を終了させることができます。RETURN は常に現在のルーチンを終了し、呼び出し元のルーチンに戻るか、呼び出し元のルーチンがない場合はプログラムを終了します。RETURN は、コード・ブロック内から発行されたかどうかに関係なく、常に同じ動作を行います。これには、TRY ブロックまたは CATCH ブロックが含まれます。

  • これに対して QUIT は、FOR ループ、DO WHILE ループ、WHILE ループ、あるいは TRY ブロックまたは CATCH ブロックの内部から発行されたときに、現在の構造のみを終了します。QUIT は、現在のブロック構造を終了し、そのブロック構造の外側にある次のコマンドで現在のルーチンの実行を続けます。QUIT は、ブロック構造の外部または IFELSEIFELSE の各コード・ブロックの内部から発行されたときに、現在のルーチンを終了します。

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

  • 引数なし

  • 引数付き

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

引数なしの RETURN

引数なしの RETURN は、値を返さずに現在のコンテキストを終了します。これは、DO または XECUTE コマンドで開始されたプロセスの実行レベルを終了するために使用されます。

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

引数付きの RETURN

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

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

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

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

引数

pc

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

expression

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

以下の 2 つの例では、フロー制御構造内から発行されたときの RETURNQUIT の動作を比較します。RETURN は MySubroutine を終了して MyRoutine に戻ります。QUIT は、FOR ループを終了し、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 RETURN
    WRITE "  loop again",!
  }
  WRITE "MySubroutine line not displayed with RETURN",!
  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 QUIT
    WRITE "  loop again",!
  }
  WRITE "MySubroutine line displayed with QUIT",!
  QUIT

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

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

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

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 は、入れ子の 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 コマンドの引数は、オブジェクト・メソッドです。Caché はメソッドの実行を終了して、呼び出しているルーチンに制御を戻します。

   RETURN inv.TotalNum()

メモ

RETURN による変数のリストア

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

暗黙の RETURN

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

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

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

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

DO での振る舞い

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

XECUTE での振る舞い

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

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

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

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

$$name(parameters)

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

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

プログラム・スタックからのレベルの消去

RETURN の各呼び出しは、コンテキスト・フレームをプロセスのコール・スタックから削除します。$STACK 特殊変数は、コール・スタックのコンテキスト・フレームの現在の番号を含みます。

プログラマ・プロンプトから RETURN を実行すると、プログラム・スタックから一部、またはすべてのレベルを消去することができます。以下の例では、スタックから上位 2 つのレベルが消去されます。

   RETURN 2

引数なしの RETURN は、スタックからすべてのレベルを消去します。

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

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

関連項目

FeedbackOpens in a new tab