美文网首页
第十四章 Caché 变量大全 $STACK 变量

第十四章 Caché 变量大全 $STACK 变量

作者: Cache技术分享 | 来源:发表于2021-01-26 06:51 被阅读0次

第十四章 Caché 变量大全 $STACK 变量

包含保存在调用堆栈中的上下文框架的数量。

大纲

$STACK
$ST

描述

$STACK包含当前保存在进程的调用堆栈中的上下文框架的编号。还可以将$STACK视为当前正在执行的上下文的从零开始的上下文级别编号。因此,启动Caché JOB时,在将任何上下文保存到调用堆栈之前,$STACK的值为零(0)。

每次例程使用DO``命令调用另一个例程时,当前正在执行的例程的上下文都保存在调用堆栈中,并且在新创建的被调用例程的上下文中开始执行。被调用的例程可以依次调用另一个例程,依此类推。每个其他调用都会导致另一个保存的上下文被放置在调用堆栈中。

XECUTE命令和用户定义的函数引用也将建立新的执行上下文。 GOTO命令没有。

当通过DO命令,XECUTE命令或用户定义的函数引用创建新上下文时,$STACK的值将递增。当使用QUIT命令退出上下文时,先前的上下文将从调用堆栈中恢复,并且$STACK的值递减。

不能使用SET命令修改此特殊变量。尝试这样做会导致<SYNTAX>错误。

$ESTACK$STACK相同,除了可以通过发出新的$ESTACK命令在任何时候将$ESTACK级别设置为0(零)。不能新建$STACK特殊变量。

错误处理

发生错误时,所有上下文信息将立即保存在程序错误堆栈中。这将更改$STACK的值。然后,可以使用$STACK函数访问上下文信息,直到错误处理程序清除$ECODE的值为止。换句话说,虽然$ECODE的值非空,但$STACK函数返回有关错误堆栈中保存的上下文的信息,而不是有关相同指定上下文级别的活动上下文的信息。

终端提示的上下文级别

从程序调用的例程与使用DO命令从终端提示中调用的例程在不同的上下文级别开始。在终端提示下键入DO命令将导致创建新的上下文。下面的示例显示了从例程或终端提示中调用的例程START

/// d ##class(PHA.TEST.SpecialVariables).STACK()
ClassMethod STACK()
{
START
    ; 显示上下文级别并退出
    WRITE !,"常规START中的上下文级别为 ",$STACK
    QUIT
}

  • studio
d ##class(PHA.TEST.SpecialVariables).STACK()

常规START中的上下文级别为 8
  • terminal
DHC-APP>d ##class(PHA.TEST.SpecialVariables).STACK()
 
常规START中的上下文级别为 1

示例

下面的示例演示了如何在创建新上下文时增加$STACK的值,以及在退出上下文时如何减少$STACK的值。

示例代码如下:

/// d ##class(PHA.TEST.SpecialVariables).STACK1()
ClassMethod STACK1()
{
STA
    WRITE !,"例程STA中的上下文级别 = ",$STACK
    DO A
    WRITE !,"例行程序A之后的上下文级别 = ",$STACK
    QUIT
A
    WRITE !,"例程A中的上下文级别 = ",$STACK
    DO B
    WRITE !, "例行程序B之后的上下文级别 = ",$STACK
    QUIT
B
    WRITE !,"例程B中的上下文级别 = ",$STACK
    XECUTE "WRITE !,""XECUTE中的上下文级别 = "",$STACK" 
    WRITE !,"XECUTE之后的上下文级别 = ",$STACK
    QUIT
}

DHC-APP>d ##class(PHA.TEST.SpecialVariables).STACK1()
 
例程STA中的上下文级别 = 1
例程A中的上下文级别 = 2
例程B中的上下文级别 = 3
XECUTE中的上下文级别 = 4
XECUTE之后的上下文级别 = 3
例行程序B之后的上下文级别 = 2
例行程序A之后的上下文级别 = 1

相关文章

网友评论

      本文标题:第十四章 Caché 变量大全 $STACK 变量

      本文链接:https://www.haomeiwen.com/subject/pwiwzktx.html