1. 程式人生 > 其它 >第三章 Caché 變數大全 $ESTACK 變數

第三章 Caché 變數大全 $ESTACK 變數

技術標籤:Caché 變數大全CachéCacheESTACK堆疊系統變數

文章目錄

第三章 Caché 變數大全 $ESTACK 變數

包含從使用者定義的點儲存在呼叫堆疊上的上下文幀的數量。

大綱

$ESTACK
$ES

描述

$ESTACK包含從使用者定義的點為JOB儲存在呼叫堆疊上的上下文幀的數量。可以通過使用new命令建立$ESTACK的新副本來指定這一點。

$ESTACK

特殊變數類似於$STACK特殊變數。兩者都包含當前儲存在JOB或程式的呼叫堆疊中的上下文框架的數量。更改上下文時,Caché會遞增並恢復兩者。主要區別在於,可以隨時使用NEW命令將$ESTACK計數重置為零。無法重置$STACK計數。

上下文框架和呼叫堆疊

啟動Caché映像時,在將任何上下文儲存到呼叫堆疊之前,$ESTACK$STACK的值均為零。每次例程使用DO呼叫另一個例程時,系統都會將當前正在執行的例程的上下文儲存在呼叫堆疊中,遞增$ESTACK$STACK,並在新建立的上下文中開始執行被呼叫例程。被呼叫的例程可以依次呼叫另一個例程,依此類推。每次呼叫另一個例程時,Caché都會遞增$ESTACK

$STACK並將更多儲存的上下文放在呼叫堆疊中。

發出DO命令,EXECUTE命令或對使用者定義函式的呼叫會建立新的執行上下文。不會發出GOTO命令。

DO命令,XECUTE命令或使用者定義的函式引用建立新上下文時,Caché將增加$STACK$ESTACK的值。當QUIT命令導致上下文退出時,Caché從呼叫堆疊中恢復以前的上下文,並減小$STACK$ESTACK的值。

不能使用SET命令修改$ESTACK$STACK特殊變數。嘗試這樣做會導致<SYNTAX>錯誤。

建立$ESTACK

可以使用NEW命令在任何上下文中建立$ESTACK的新副本。 Caché採取以下行動:

  • 儲存$ESTACK的舊副本。
  • 建立新的$ESTACK副本,其值為零(0)。

這樣,可以將特定上下文建立為$ESTACK級別0上下文。當使用DOXECUTE或使用者定義的函式建立新的上下文時,Caché會將此$ESTACK值遞增。但是,當退出建立新$ESTACK的上下文時($ESTACK處於級別0),Caché會還原$ESTACK的先前副本的值。

示例

以下示例顯示了$ESTACK上的NEW命令的作用。在此的示例MainRoutine顯示$STACK$ESTACK的初始值(它們是相同的值)。然後,它呼叫Sub1。該呼叫將增加$STACK$ESTACKNEW命令建立一個值為0的$ESTACKSub1呼叫Sub2,遞增$STACK$ESTACK。返回MainRoutine將恢復$STACK$ESTACK的初始值:

/// d ##class(PHA.TEST.SpecialVariables).ESTACK()
ClassMethod ESTACK()
{
Main
	WRITE !,"Initial: $STACK=",$STACK," $ESTACK=",$ESTACK
	DO Sub1
	WRITE !,"Return: $STACK=",$STACK," $ESTACK=",$ESTACK
	QUIT
Sub1
	WRITE !,"Sub1Call: $STACK=",$STACK," $ESTACK=",$ESTACK
	NEW $ESTACK
	WRITE !,"Sub1NEW: $STACK=",$STACK," $ESTACK=",$ESTACK
	DO Sub2
	QUIT
Sub2
	WRITE !,"Sub2Call: $STACK=",$STACK," $ESTACK=",$ESTACK
	QUIT
}
DHC-APP>d ##class(PHA.TEST.SpecialVariables).ESTACK()
 
Initial: $STACK=1 $ESTACK=1
Sub1Call: $STACK=2 $ESTACK=2
Sub1NEW: $STACK=2 $ESTACK=0
Sub2Call: $STACK=3 $ESTACK=1
Return: $STACK=1 $ESTACK=1

下面的示例演示瞭如何通過發出DOXECUTE命令在建立新上下文時增加$ESTACK的值,並在退出這些上下文時減小其值。它還顯示GOTO命令不會建立新上下文或增加$ESTACK

/// d ##class(PHA.TEST.SpecialVariables).ESTACK1()
ClassMethod ESTACK1()
{
Main
	NEW $ESTACK
	WRITE !,"Initial Main: $ESTACK=",$ESTACK   // 0
	DO Sub1
	WRITE !,"Return Main: $ESTACK=",$ESTACK   // 0
	QUIT
Sub1
	WRITE !,"Sub1 via DO: $ESTACK=",$ESTACK  // 1
	XECUTE "WRITE !,""Sub1 XECUTE: $ESTACK="",$ESTACK"   // 2
	WRITE !,"Sub1 post-XECUTE: $ESTACK=",$ESTACK   // 1
	GOTO Sub2
Sub1Return
	WRITE !,"Sub1 after GOTO: $ESTACK=",$ESTACK  // 1
	QUIT
Sub2
	WRITE !,"Sub2 via GOTO: $ESTACK=",$ESTACK   // 1
	GOTO Sub1Return
}

DHC-APP>d ##class(PHA.TEST.SpecialVariables).ESTACK1()
 
Initial Main: $ESTACK=0
Sub1 via DO: $ESTACK=1
Sub1 XECUTE: $ESTACK=2
Sub1 post-XECUTE: $ESTACK=1
Sub2 via GOTO: $ESTACK=1
Sub1 after GOTO: $ESTACK=1
Return Main: $ESTACK=0

注意

終端提示的上下文級別

從程式呼叫的例程與在終端提示下使用DO命令呼叫的例程在不同的上下文級別開始。在終端提示下輸入DO命令時,系統會為該例程建立一個新的上下文。

呼叫的例程可以通過建立$ESTACK Level 0上下文進行補償,然後對所有上下文級引用使用$ESTACK

請考慮以下例程:

/// d ##class(PHA.TEST.SpecialVariables).ESTACK2()
ClassMethod ESTACK2()
{
START
	; 建立$ESTACK 0級上下文
	NEW $ESTACK
	; 顯示$STACK上下文級別
	WRITE !,"$STACK level in routine START is ",$STACK
	; 顯示$ESTACK上下文級別並退出
	WRITE !,"$ESTACK level in routine START is ",$ESTACK
	QUIT
}

從程式執行Start時,會看到以下顯示:

$STACK level in routine START is 0
$ESTACK level in routine START is 0

當在終端提示符下發出do^start命令來執行START時,會看到以下顯示:

DHC-APP>d ##class(PHA.TEST.SpecialVariables).ESTACK2()
 
$STACK level in routine START is 1
$ESTACK level in routine START is 0

$ESTACK和錯誤處理

當錯誤處理程式必須將呼叫堆疊展開到特定上下文級別時,$ESTACK在錯誤處理期間特別有用。