第三章 Caché 變數大全 $ESTACK 變數
技術標籤:Caché 變數大全CachéCacheESTACK堆疊系統變數
文章目錄
-
第三章 Caché 變數大全 $ESTACK 變數 - 大綱
- 描述
- 示例
- 注意
- `$ESTACK`和錯誤處理
第三章 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上下文。當使用DO
,XECUTE
或使用者定義的函式建立新的上下文時,Caché會將此$ESTACK
值遞增。但是,當退出建立新$ESTACK
的上下文時($ESTACK
處於級別0),Caché會還原$ESTACK
的先前副本的值。
示例
以下示例顯示了$ESTACK
上的NEW命令的作用。在此的示例MainRoutine
顯示$STACK
和$ESTACK
的初始值(它們是相同的值)。然後,它呼叫Sub1。該呼叫將增加$STACK
和$ESTACK
。 NEW
命令建立一個值為0的$ESTACK
。Sub1
呼叫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
下面的示例演示瞭如何通過發出DO
和XECUTE
命令在建立新上下文時增加$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
在錯誤處理期間特別有用。