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?

$STACK

コール・スタックに保存されているコンテキスト・フレーム数を含みます。

Synopsis

$STACK
$ST

概要

$STACK には、プロセスのコール・スタックで現在保存されているコンテキスト・フレームの番号が含まれます。現在実行しているコンテキストの 0 から始まるコンテキスト・レベル番号として、$STACK を見ることもできます。そのため、Caché ジョブが開始すると、コンテキストがコール・スタックで保存される前は、$STACK の値は 0 です。

DO コマンドでルーチンが他のルーチンを呼び出すたびに、現在実行しているルーチンのコンテキストはコール・スタックに保存され、実行は呼び出されるルーチンの新しく作成されたコンテキストで始まります。呼び出されたルーチンは、順番に他のルーチンを呼び出すことができます。各追加コールは、保存された他のコンテキストをコール・スタックに置きます。

XECUTE コマンドと外部関数参照も、新規の実行コンテキストを作成します。GOTO コマンドは作成しません。

DO コマンド、XECUTE コマンド、外部関数参照が新しいコンテキストを作成するたびに、$STACK の値はインクリメントします。コンテキストが QUIT コマンドで終了するたびに、前のコンテキストはコール・スタックから戻され、$STACK の値はディクリメントします。

この特殊変数は、SET コマンドを使用して変更することはできません。変更を試みると、<SYNTAX> エラーが返されます。

$ESTACK は、$STACK と同じです。ただし、NEW $ESTACK コマンドを発行することで、いつでも 0 (ゼロ) の $ESTACK レベルを作成できる点が異なります。NEW を使用して、$STACK 特殊変数をリセットすることはできません。

エラー処理

エラー発生時、すべてのコンテキスト情報はプロセス・エラー・スタックに即座に格納されます。これにより $STACK の値が変更されます。この場合、エラー・ハンドラによって $ECODE 値がクリアされるまで、$STACK 関数を使用してコンテキスト情報にアクセスできます。つまり、$ECODE 値が NULL でない場合、$STACK 関数は、エラー・スタックに保存されたコンテキストと同じ指定されたコンテキスト・レベルのアクティブなコンテキストではなく、エラー・スタックに保存されたコンテキストの情報を返します。

アプリケーション・モードとプログラマ・モードでのコンテキスト・レベル

アプリケーション・モードで呼び出されるルーチンは、DO コマンドを使用して、プログラマ・モード・プロンプトで呼び出されるルーチンとは異なるコンテキスト・レベルで開始します。プログラマ・モード・プロンプトで入力する DO コマンドは、新しいコンテキストを作成します。以下の例は、アプリケーション・モードとプログラマ・モードで呼び出されるルーチン START を示しています。

以下のルーチンを考慮してみましょう。

START
  ; Display the context level and exit
  WRITE !,"Context level in routine START is ",$STACK
  QUIT

アプリケーション・モードで START を実行すると、以下が表示されます。

Context level in routine START is 0

(ターミナル・プロンプトで DO ^START を発行して) プログラマ・モードで START を実行すると、以下が表示されます。

Context level in routine START is 1

以下の例は、$STACK が新しいコンテキストが作成されるときにインクリメントされ、コンテキストが終了するときにディクリメントされる方法を示しています。

サンプル・コードは以下のとおりです。

STA
  WRITE !,"Context level in routine STA = ",$STACK
  DO A
  WRITE !,"Context level after routine A = ",$STACK
  QUIT
A
  WRITE !,"Context level in routine A = ",$STACK
  DO B
  WRITE !, "Context level after routine B = ",$STACK
  QUIT
B
  WRITE !,"Context level in routine B = ",$STACK
  XECUTE "WRITE !,""Context level in XECUTE = "",$STACK" 
  WRITE !,"Context level after XECUTE = ",$STACK
  QUIT

このコードを使用したサンプル・セッションは、次のように実行されます。

USER>DO ^STA 
Context level in routine STA = 1 
Context level in routine A = 2 
Context level in routine B = 3 
Context level in XECUTE = 4 
Context level after XECUTE = 3 
Context level after routine B = 2 
Context level after routine A = 1

関連項目

FeedbackOpens in a new tab